julia - 我如何在 Julia 中按值(value)发货?

标签 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”?

最佳答案

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))

关于julia - 我如何在 Julia 中按值(value)发货?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51568006/

相关文章:

julia - 无法在 FreeBSD 13 上使用 Julia 1.6.3 安装 PyCall.jl

julia - 为什么 "Int"存在,但 "Float"不存在?

C# 无法解析符号

html - 在 HTML 页面上组合 <symbol> 和 <use> SVG 标签

ios - 使用 dispatch_async 时的 EXC_BAD_ACCESS

vue.js - vue3 组合 api 中的 vuex 模块 axios

julia - 可以逐行分析 Julia 代码吗?

visualization - 用 Julia 编程语言画图

string - 批处理 - 用百分比符号替换

ios - 如何在swift中实现优化的多个计时器?