我如何在 julia 中按价值分配?
How do I do dispatch on value in julia?
我听说 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"?
根据值进行调度并不神奇。
它使用与参数类型调度完全相同的机制。
因此,如果要在其上分派,则需要传入一个实例参数类型,该类型具有该值作为类型参数。
在你的问题中 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))
我听说 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"?
根据值进行调度并不神奇。 它使用与参数类型调度完全相同的机制。 因此,如果要在其上分派,则需要传入一个实例参数类型,该类型具有该值作为类型参数。
在你的问题中 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))