多个同一子模块定义的方法错误

时间:2015-08-03 22:13:18

标签: julia

想象一下,我在文件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.av2.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.av2.a一起使用的更优雅/ julianistic方式?

1 个答案:

答案 0 :(得分:3)

include函数与将myMod.jl中的代码粘贴到调用include的位置基本相同。您使用它的方式,就好像您定义了两个不同的模块A.myModB.myMod,这些模块碰巧具有完全相同的实现。虽然这两个模块具有相同的实现,但它们不具有相同的标识。因此A.myMod.TB.myMod.T的类型不同。

您要做的只是定义myMod模块一次,然后在定义TaTb时使用它。您可以使用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)