使用Julia多重派发入门

6

以下是我认为是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,则可以正常工作,但这不再利用多重分派。为什么我无法使用多重分派?


1
我建议您在文档中阅读关于R的值得注意的不同之处(尽管该特定情况未在其中提到)。 - phipsgabler
1
很好猜到我是一个R用户(我猜不久之后我会成为前R用户),而且我确实在一段时间前阅读了你提供的文档。阅读Bogumił Kamiński对我的问题的出色回答时,我有了“啊哈!现在我明白了!”的时刻。然后,我需要一个正则表达式来自动将我迄今为止编写的所有Julia代码从语法myfunc = function(x,y,z)更改为语法function myfunc(x,y,z)。如果其他人也遇到同样的困境,我使用的正则表达式是: ([a-zA-Z_][a-zA-Z0-9_!]*)\s*=\s*function\( 替换字符串为: function $1( - Philip Swannell
1个回答

17

这是已经修正过的版本:

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只指向function(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,因为f变量名已经被占用且无法重新赋值):

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

1
那就是我所说的一个很棒的答案! - Julia Learner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接