我将用一个最小的例子来解释我的问题。假设我有三个文件:
A.jl
module A
export Atype, f
type Atype
end
f = function(x::Atype)
println("f called with A")
end
end #module
B.jl
module B
export Btype, f
type Btype
end
f = function(x::Btype)
println("f called with B")
end
end #module
主要.jl
using A
using B
main = function()
x = Atype()
f(x)
end
main()
在这里,我有两个版本的f
功能。如果我正确理解了多分派的概念,应该在运行时扣除应该使用哪个版本。因此,我预计运行 Main.jl 会打印f called with A
。不幸的是,我得到
$ julia Main.jl
ERROR: type: anonymous: in typeassert, expected Btype, got Atype
in include at /usr/bin/../lib64/julia/sys.so
in process_options at /usr/bin/../lib64/julia/sys.so
in _start at /usr/bin/../lib64/julia/sys.so
while loading /home/grzes/julia_sucks/Main.jl, in expression starting on line 9
如果我注释掉using B
,它工作正常。显然,f
从 B.jl 覆盖f
了从 A.jl。
所以,问题是:问题出在哪里?在我的方法中还是在我使用的 Julia 版本中(0.3.7)?我该如何规避这个?
请注意,替换using A
并import A
使用完全限定名称(例如A.f
)不是一个好的解决方案。它与多重分派的症结相矛盾——在编译时我不知道是否应该使用A.f
or B.f
。