For example, if I have a function outer
that has an internal implementation inner
, and I want to extend inner
in different modules.
module Outer
export outer
function outer(a, b)
# do something
print(methods(inner))
return inner(a, b)
end
function inner end
module A
import ..Outer
Outer.inner(a, b) = a + b
end
module B
import ..Outer
Outer.inner(a, b) = a * b
end
end
As you can see, outer
is my public API. And I want it to behave differently if I load different modules. Usually, I can define 2 methods on the types of args a
and b
. But in this example, a
and b
have fixed types, so no dispatch on types. The expected behavior is that if I load A
, outer(1, 2) -> 3
, and once I write using Outer.B
in the same REPL environment, outer(1, 2) -> 2
.
julia> using .Outer
julia> outer(1, 2)
# 1 method for generic function "inner":
[1] inner(a, b) in Main.Outer.B at REPL[1]:252
If I invoke outer
, inner
defined in A
is rewritten by that defined in B
. I tried Base.invokelatest
and it gave the same result.