想象一下,我在文件myMod.jl
中有以下模块:
module myMod
type T
i::Int
end
function sum(T1::T, T2::T)
T1.i + T2.i
end
end
现在,我想在其他地方定义两个能够使用T
中定义的myMod
类型的模块,所以让我编写以下代码:
# --- Define first module
module A
include("myMod.jl")
type Ta
a::myMod.T
end
end
# --- Define second module
module B
include("myMod.jl")
type Tb
a::myMod.T
end
end
# --- Use the modules
using A, B
v1 = A.Ta(A.myMod.T(1))
v2 = B.Tb(B.myMod.T(2))
到目前为止一切顺利,一切正常。我甚至可以用
调用sum方法A.myMod.sum(v1.a, v1.a) # Returns 2, as expected
但是,我无法总结v1.a
和v2.a
,尽管typeof(v1.a)
和typeof(v2.a)
都是T
:
A.myMod.sum(v1.a, v2.a)
评估错误... / myTest.jl:
sum
没有匹配sum的方法(:: T, :: T)
我觉得虽然v2.a
的类型为T
,但Julia记得已经在模块B中创建了它,因此无法将其识别为T对象。
有解决方法吗?或者使sum
函数与v1.a
和v2.a
一起使用的更优雅/ julianistic方式?
答案 0 :(得分:3)
include
函数与将myMod.jl中的代码粘贴到调用include
的位置基本相同。您使用它的方式,就好像您定义了两个不同的模块A.myMod
和B.myMod
,这些模块碰巧具有完全相同的实现。虽然这两个模块具有相同的实现,但它们不具有相同的标识。因此A.myMod.T
与B.myMod.T
的类型不同。
您要做的只是定义myMod
模块一次,然后在定义Ta
和Tb
时使用它。您可以使用using
执行此操作,如下所示。我假设myMod.jl文件中仍然定义了myMod
,但如果您愿意,可以在同一个文件中定义它们。
include("myMod.jl")
# --- Define first module
module A
using myMod
type Ta
a::myMod.T
end
end
# --- Define second module
module B
using myMod
type Tb
a::myMod.T
end
end
# --- Use the modules
using A, B, myMod
v1 = A.Ta(myMod.T(1))
v2 = B.Tb(myMod.T(2))
myMod.sum(v1.a, v2.a)