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