Julia 中的类型化 kwargs

Typed kwargs in Julia

是否可以在 Julia 中输入函数 kwargs?

以下适用于标准 Varargs。

function int_args(args::Integer...)
    args
end

int_args(1, 2, 3)
# (1, 2, 3)

int_args(1, 2, 3.0)
# ERROR: MethodError: `int_args` has no method matching int_args(::Int64, ::Int64, ::Float64)

然而,当将同样的语法应用于 kwargs 时,所有函数调用似乎都会出错。

function int_kwargs(; kwargs::Integer...)
    kwargs
end

int_kwargs(x=1, y=2)
# ERROR: MethodError: `__int_kwargs#0__` has no method matching __int_kwargs#0__(::Array{Any,1})

普通关键字参数可以有类型,如 function f(x; a::Int=0),但这不适用于 "rest" 关键字参数。另请注意,由于我们目前不分派关键字参数,因此本例中的 a::Int 是类型断言而不是分派规范。

看来这个案例处理得不好,至少需要一个更好的错误信息。我鼓励您在 https://github.com/JuliaLang/julia/issues.

提交问题

我不确定语法 x::T... 对于关键字参数应该意味着什么。在可变参数的情况下,很明显 x 的每个元素都应该具有 T 类型,但对于 rest 关键字参数,每个元素实际上是一个符号值对。当然,我们可以赋予它您所描述的含义(所有值的类型都是 T),但这似乎并不经常出现。与更像列表或数组的可变参数不同,关键字参数往往是多种多样的。