https://github.com/JuliaLang/julia/issues/7357
On Wed, Aug 26, 2015 at 2:27 PM Yichao Yu <[email protected]> wrote: > On Wed, Aug 26, 2015 at 12:33 PM, Matt Bauman <[email protected]> wrote: > > Yes, this can be surprising. Look at `methods(u)`: > > > > julia> methods(u) > > # 5 methods for generic function "u": > > u(c::Float64) at none:7 > > u(c::Float64, h::Float64) at none:3 > > u(c::Float64, h::Float64, b) at none:3 > > u(c::Float64, h::Float64, b, a) at none:3 > > u(c::Float64, a) at none:7 > > > > When you call `u(2.)`, it fills in the missing argument and then *calls > `u` > > again*, with two arguments. Since `a` is a Float64, when it does this, > the > > method that's dispatched to isn't from the second definition (on > psuedo-line > > 7), but rather the first definition (line 3). It's just a little tricky > > that the convenience methods that are generated for optional arguments > might > > re-dispatch to a completely different definition. > > This sounds like a bug for me. We should probably use a inner method > just like what we do for keyword argument. > > > > > On Wednesday, August 26, 2015 at 12:22:19 PM UTC-4, Nils Gudat wrote: > >> > >> I'm defining a function with two methods as follows: > >> > >> a = 2. > >> b = 0.8 > >> > >> function u(c::Float64, h::Float64, b=b, a=a) > >> ((c/(h^b))^(1-a))/(1-a) > >> end > >> > >> function u(c::Float64, a=a) > >> c^(1-a)/(1-a) > >> end > >> > >> However, when calling u(2.), the result is -0.87..., which should be the > >> result of the function call u(2., 2.). > >> Clearly I misunderstand how multiple dispatch is working here - I > thought > >> when defining a function f() with one method f(::Float64), and another > >> method f(::Float64, ::Float64), the two-argument version would only be > >> called if I'm actually supplying two arguments!? >
