Philip Swannell
Philip Swannell

Reputation: 935

Getting started with Julia Multiple Dispatch

Here's what looks to me the simplest imaginable example of multiple dispatch in Julia - it's the entire (8 line) contents of a file called 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)

and yet when I run that (via include("Adhoc.jl")) julia complains:

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

With screenshot here

If I change that second instance of f to g things work, but that's no longer making use of multiple dispatch. How come I can't get to first base with multiple dispatch?

Upvotes: 6

Views: 1673

Answers (1)

Bogumił Kamiński
Bogumił Kamiński

Reputation: 69879

This is the corrected version:

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)

The problem with your code is that your original code created an anonymous function and assigned it to a variable f. And you did it twice, thus f pointed only at function(x::Float64).

You can see the problem with your original code by running it in 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

and you see that f points at an anonymous function which has only one method.

Running my code (you need to restart Julia REPL as f variable name will be already taken and it cannot be reassigned):

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

Upvotes: 18

Related Questions