Julia能否按关键字多重派发?

我想写两个数值数量、类型完全相同的函数。但是我想用关键字来作为区别。

julia> function fun(x, y; b::Float64)
           (x+y)*b
       end
fun (generic function with 1 method)

julia> function fun(x, y; a::Int)
           (x+y)+a
       end
fun (generic function with 1 method)

julia> fun(1, 1, a=1)
3

julia> fun(1, 1, b=1.0)
ERROR: UndefKeywordError: keyword argument a not assigned
Stacktrace:
 [1] top-level scope
   @ REPL[28]:1

可以看到后定义的函数把第一个给冲掉了。

然而,我看到range函数有这个功能:

julia> range(1, step=5, length=100)
  1:5:496

julia> range(1, step=5, stop=100)
  1:5:96

我希望的效果就是这样。

range 的源代码好像是写在一个函数里手动判断的,
这不是个好的代码风格,;可以考虑用 @generated

你好,这个@generated有什么用吗?似乎提了一些限制:只能读取参数的类型、只能返回"quoted"表达式。好处是一点没说。

然后"quoted expression"能详细解答一下吗?我只有在画图时用:red替代"red",还有读取DataFrame时用:col1来替代"col1"的。我一直以为是字符串的简单写法。刚刚测试typeof(:55)居然是Int64,给我弄懵了。

只能读取参数的类型

啊,确实
还是好好手动判断吧,虽然我看不出为什么要写这样的代码

然后"quoted expression"能详细解答一下吗?

文档 “Meta Programming” 一节应该有写,我网不好给不了链接

1 个赞

我记得Julia是不能通过关键字做派发的: Rules for method dispatch with keyword arguments - Internals & Design - JuliaLang

至于说range的用法,可以直接参考Base里面的实现:
julia/range.jl at f3459234837b13e26abebc22c21d897398151588 · JuliaLang/julia (github.com)
大致就是按照关键字是否为Any,Nothing,或者其他类型进行人工区分。

1 个赞

谢谢各位的解答。