Julia Multiple Dispatch入门

Julia Multiple Dispatch入门,julia,Julia,在我看来,这是Julia中可以想象的最简单的多分派示例—它是名为adhoc.jl的文件的全部(8行)内容 f = function(x::String) println("Called first version of f") end f = function(x::Float64) println("Called second version of f") end f("x") f(1.0) 但当我运行时(通过include(“Adhoc.jl”)),julia抱怨: ERR

在我看来,这是Julia中可以想象的最简单的多分派示例—它是名为adhoc.jl的文件的全部(8行)内容

f = function(x::String)
    println("Called first version of f")
end
f = function(x::Float64)
    println("Called second version of f")
end
f("x")
f(1.0)
但当我运行时(通过
include(“Adhoc.jl”)
),julia抱怨:

ERROR: LoadError: MethodError: no method matching 
(::getfield(Main, Symbol("##17#18")))(::String)
带截图


如果我将
f
的第二个实例更改为
g
的话,事情会正常运行,但这不再使用多重分派。为什么我不能通过多次调度到达一垒?

这是正确的版本:

function f(x::String)
    println("Called first version of f")
end
function f(x::Float64)
    println("Called second version of f")
end
f("x")
f(1.0)
代码的问题在于,原始代码创建了一个匿名函数,并将其分配给变量
f
。您做了两次,因此
f
只指向
函数(x::Float64)

您可以通过在Julia REPL中运行原始代码来发现问题:

julia> f = function(x::String)
           println("Called first version of f")
           end
#3 (generic function with 1 method)

julia> f = function(x::Float64)
           println("Called second version of f")
           end
#5 (generic function with 1 method)

julia> methods(f)
# 1 method for generic function "#5":
[1] (::getfield(Main, Symbol("##5#6")))(x::Float64) in Main at REPL[2]:2
您可以看到,
f
指向一个只有一个方法的匿名函数

运行我的代码(您需要重新启动Julia REPL,因为变量名将被占用,并且无法重新分配):


我建议你阅读文档中的相关内容(尽管这里没有提到具体的案例)。我猜我是一个R用户(我猜不久前是前R用户),我确实阅读了你之前链接到的文档。读到博古米卡米斯基对我问题的出色回答,对我来说是一个“啊!啊!现在我明白了!”的时刻。然后,我需要一个正则表达式来自动将我迄今为止编写的所有Julia代码从语法
myfunc=function(x,y,z)
更改为语法
function myfunc(x,y,z)
,以防其他人发现自己处于同样的困境,我使用的正则表达式是:
([a-zA-z][a-zA-Z0-9.]*)\s*=\s*function\(
替换字符串:
函数$1(
这就是我所说的一个很好的答案!
julia> function f(x::String)
           println("Called first version of f")
           end
f (generic function with 1 method)

julia> function f(x::Float64)
           println("Called second version of f")
           end
f (generic function with 2 methods)

julia> f("x")
Called first version of f

julia> f(1.0)
Called second version of f

julia> methods(f)
# 2 methods for generic function "f":
[1] f(x::Float64) in Main at REPL[2]:2
[2] f(x::String) in Main at REPL[1]:2