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!?
