Julia Multiple Dispatch入门
在我看来,这是Julia中可以想象的最简单的多分派示例—它是名为adhoc.jl的文件的全部(8行)内容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
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