Начало работы с Julia Multiple Dispatch - PullRequest
0 голосов
/ 07 сентября 2018

Вот то, что мне кажется самым простым вообразимым примером множественной отправки в Юлии - это все (8 строк) содержимое файла с именем adhoc.jl.

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")), Джулия жалуется:

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

со скриншотом здесь

Если я изменю этот второй экземпляр f на g, все будет работать, но это больше не использует множественную диспетчеризацию. Почему я не могу попасть на первую базу с несколькими отправками?

1 Ответ

0 голосов
/ 07 сентября 2018

Это исправленная версия:

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
...