我该如何在朱莉娅身上发价?

时间:2018-07-28 04:22:35

标签: julia symbols dispatch

我听说julia派出了符号值, 并且要做,所以我使用Val{:MySymbol}

但这似乎不起作用:

julia> foo(x) = "other"
foo (generic function with 1 method)

julia> foo(x::Val{:zinger}) = "It was zinger"
foo (generic function with 2 methods)

julia> foo(:zinger)
"other"

为什么不输出“ It was zinger”?

1 个答案:

答案 0 :(得分:6)

See the Docs

调度值不是魔术。 它使用与分派参数类型完全相同的机制。 因此,如果要在其上分派,则需要传递一个实例参数类型,该实例参数类型具有该值作为类型参数。

在您的问题中,Val是参数类型-它仅用于此类情况。

所以你需要写:

julia> foo(Val{:zinger}())
"It was zinger"

如果您愿意,可以编写foo的重载以自动将其参数包装为类型参数

julia> foo(x::Symbol) = foo(Val{x}())
foo (generic function with 3 methods)

julia> foo(:zinger)
"It was zinger"

但是,这将导致动态调度。

julia> @code_lowered foo(:zinger)
CodeInfo(:(begin
        nothing
        return (Main.foo)(((Core.apply_type)(Main.Val, x))())
    end))

vs完全实现的编译时解决方案:

julia> @code_lowered foo(Val{:zinger}())
CodeInfo(:(begin
        nothing
        return "It was zinger"
    end))