我正在做一个较大的项目(大约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")
,但是它不起作用。
我发现的唯一解决方案是不制作模块,而只是定义文件内部的功能。这是可行的,但是为了将来进行调试和更改,我宁愿使用模块结构,因为它允许我为每个文件的标识符包含文件的定义。
答案 0 :(得分:1)
最简单的方法是执行以下操作:
module module1
import ..Typ
function func1(x::Typ)
return length(x.xs)
end
end
(并且所有功能都可以在您早先加载type.jl文件的情况下起作用)
..
告诉Julia在包含给定模块的模块中寻找Typ
的定义。