Julia 中的函数重载 - 关键字参数

fak*_*akl 2 overloading julia

假设一个带有关键字的函数fun()像这样重载:

function fun(; a::Real)
    return a
end

function fun(; a::Vector)
    return a
end
Run Code Online (Sandbox Code Playgroud)

执行以下代码时,出现类型错误TypeError: in keyword argument a, expected Vector, got a value of type Int64::

fun(1) # TypeError
fun([1, 2])
Run Code Online (Sandbox Code Playgroud)

但是当函数fun()获得正常参数时,即:

function fun(a::Real)
    return a
end

function fun(a::Vector)
    return a
end
Run Code Online (Sandbox Code Playgroud)

然后在此处执行此代码片段:

fun(1) # -> 1
fun([1, 2]) # -> [1, 2]
Run Code Online (Sandbox Code Playgroud)

作品。

为什么第二个示例有效,但第一个示例无效?

Cam*_*nek 5

关键字参数不可重载。换句话说,它们不参与方法分派——只有位置参数参与分派。当您定义第二个方法 时f(; a::Vector),它会覆盖第一个方法:

julia> function fun(; a::Real)
           return a
       end
fun (generic function with 1 method)

julia> function fun(; a::Vector)
           return a
       end
fun (generic function with 1 method)

julia> methods(fun)
# 1 method for generic function "fun":
[1] fun(; a) in Main at REPL[2]:1
Run Code Online (Sandbox Code Playgroud)