I’m trying to understand how method definitions work inside functions. (Is this mentioned anywhere in the documentation?) From this post I learned that all method definitions for a given local function f
are combined to an anonymous functions, and each definition is replaced by assigning this anonymous function to f
. It doesn’t matter where the method definitions occur inside the enclosing function. For example, the function
function a()
f() = 0
return f
f(x) = x
end
returns a function with two methods. If there are two methods with the same signature, then the first one is ignored, and the user gets a warning.
However, there are cases where this explanation doesn’t seem to work (with Julia 1.6.1). For instance, I get
function b1()
if true
f() = 0
else
f(x) = x
end
end
b1() # generic function with 2 methods (as expected)
but
function b2()
if false
f() = 0
else
f(x) = x
end
end
b2() # UndefVarError: f not defined
The picture gets even confusing if one adds empty functions. Here are some examples:
function c1()
function f end
return f
end
c1() # generic function with 0 methods (as expected)
function c2()
function f end
return f
f() = 0
end
c2() # UndefVarError: f not defined
function c3()
g = function f end
return g
end
c3() # generic function with 0 methods (as expected)
function c4()
g = function f end
return g
f() = 0
end
c4() # nothing (which is not even a function)
function c5()
if false
f() = 0
else
function f end
end
end
c5() # nothing
Is this the intended behavior? If yes, what are the rules behind this?