使新的类型定义与所有模块兼容

时间:2019-04-14 17:06:14

标签: types module julia

我正在做一个较大的项目(大约2000行),为了更好的代码组织,我想将我的功能划分为模块,每个模块都放在一个单独的文件中。

我的大多数函数都将自定义类型Typ的变量作为参数,该变量的定义很大,我还想将其放在单独的文件type.jl中。

问题是,当我尝试创建模块module1时,如果我只是做include("type.jl"),则模块会在type.jl中创建自己的代码版本并创建类型module1.Typ,并且该类型不能用作其他模块module2的函数的参数。

我解决这个问题的想法是在Typ上定义类型Base,以便所有模块都可以访问相同的类型并在其上定义函数。最后,我想要的是具有以下结构。

在文件type.jl

struct Typ
   xs::Array{Int64,1}
   ys::Array{Int64,1}
   Typ(xs,ys) = new(xs,ys)
end

在文件module1.jl中:

module module1
   function func1(x::Typ)
      return length(x.xs)
   end
end

在文件module2.jl中:

module module2
   function func2(x::Typ)
      return length(x.ys)
   end
end

并且能够在名为main.jl的文件中运行所有这些文件

include("type.jl")
include("module1.jl")
include("module2.jl")
b = Typ([0,0],[1,1])
module1.function1(b)
module2.function2(b)

我试图在模块声明之前使用Base.include(Base,"type.jl"),但是它不起作用。

我发现的唯一解决方案是不制作模块,而只是定义文件内部的功能。这是可行的,但是为了将来进行调试和更改,我宁愿使用模块结构,因为它允许我为每个文件的标识符包含文件的定义。

1 个答案:

答案 0 :(得分:1)

最简单的方法是执行以下操作:

module module1
   import ..Typ
   function func1(x::Typ)
      return length(x.xs)
   end
end

(并且所有功能都可以在您早先加载type.jl文件的情况下起作用)

..告诉Julia在包含给定模块的模块中寻找Typ的定义。