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

Types 使新类型定义与所有模块兼容,types,module,julia,Types,Module,Julia,我正在做一个有点大的项目(大约2000行),为了更好地组织代码,我想把我的函数分成模块,每个模块都放在一个单独的文件中 我的大多数函数都将自定义类型的变量Typ作为参数,该变量的定义很大,我还想将其放在一个单独的文件type.jl中 问题是,当我尝试创建一个模块module1时,如果我只是执行include(“type.jl”),那么模块就会在type.jl中创建自己版本的代码,并创建一个类型module1.Typ,而该类型不能用作另一个模块module2函数的参数 我解决这个问题的想法是将类型

我正在做一个有点大的项目(大约2000行),为了更好地组织代码,我想把我的函数分成模块,每个模块都放在一个单独的文件中

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

问题是,当我尝试创建一个模块
module1
时,如果我只是执行
include(“type.jl”)
,那么模块就会在
type.jl
中创建自己版本的代码,并创建一个类型
module1.Typ
,而该类型不能用作另一个模块
module2
函数的参数

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

在文件
中键入.jl

struct Typ
   xs::Array{Int64,1}
   ys::Array{Int64,1}
   Typ(xs,ys) = new(xs,ys)
end
include("type.jl")
include("module1.jl")
include("module2.jl")
b = Typ([0,0],[1,1])
module1.function1(b)
module2.function2(b)
在文件
module1.jl
中:

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

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

在文件
module2.jl
中:

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

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

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

struct Typ
   xs::Array{Int64,1}
   ys::Array{Int64,1}
   Typ(xs,ys) = new(xs,ys)
end
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”)
,但它不起作用


我找到的唯一解决方案是不制作模块,只在文件中定义函数。这是可行的,但对于调试和将来的更改,我更希望使用模块结构,因为它允许我为包含其定义的文件的每个函数都有一个标识符。

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

module module1
   import ..Typ
   function func1(x::Typ)
      return length(x.xs)
   end
end
(假设您更早地加载type.jl文件,所有这些都将正常工作)

告诉Julia在包含给定模块的模块中查找
Typ
的定义