Module 朱莉娅:把模块分割成多个文件
我使用的是Julia v0.6.4。考虑下面的模块,保存在<代码> FoMod中。JL:Module 朱莉娅:把模块分割成多个文件,module,julia,Module,Julia,我使用的是Julia v0.6.4。考虑下面的模块,保存在 FoMod中。JL: module FooModule export Foo export doSomething mutable struct Foo x::Int64 function Foo(xin::Int64) new(xin) end # Foo end # struct function doSomething(F::Foo) println(F.x+123) end
module FooModule
export Foo
export doSomething
mutable struct Foo
x::Int64
function Foo(xin::Int64)
new(xin)
end # Foo
end # struct
function doSomething(F::Foo)
println(F.x+123)
end # doSomething
end # module
和一个main.jl
:
using FooModule
function main()
F = Foo(10)
doSomething(F)
end # main
现在我开始Julia REPL:
julia> include("main.jl");
julia> main()
133
也就是说,我得到了我所期望的。
现在想象一下doSomething
包含许多行,我想拆分FooModule.jl
。我想这样做:
module FooModule
export Foo
export doSomething
include("doSomething.jl") # <- include instead of writing out
mutable struct Foo
x::Int64
function Foo(xin::Int64)
new(xin)
end # Foo
end # struct
end # module
这会给出一个错误,因为doSomething.jl
对Foo
一无所知
julia> include("main.jl");
ERROR: LoadError: LoadError: LoadError: UndefVarError: Foo not defined
Stacktrace:
[1] include_from_node1(::String) at ./loading.jl:576
[2] include(::String) at ./sysimg.jl:14
[3] include_from_node1(::String) at ./loading.jl:576
[4] eval(::Module, ::Any) at ./boot.jl:235
[5] _require(::Symbol) at ./loading.jl:490
[6] require(::Symbol) at ./loading.jl:405
[7] include_from_node1(::String) at ./loading.jl:576
[8] include(::String) at ./sysimg.jl:14
while loading ~/Desktop/doSomething.jl, in expression starting on line 1
while loading ~/Desktop/FooModule.jl, in expression starting on line 6
while loading ~/Desktop/main.jl, in expression starting on line 1
如何解决此问题?只需将
include(“doSomething.jl”)
移动到函数最初的位置,即在类型定义之后。您可以将include
视为将代码复制粘贴到文件中。只需将include(“doSomething.jl”)
移动到函数最初的位置,即在类型定义之后。你可以把include
看作是将代码复制粘贴到文件中。很好的简短而甜蜜的解释。如果导入模块需要doSomething
(即linearagebra
),你会在doSomething.jl
或FooModule.jl
中使用linearagebra对进行编码吗。此外,如果FooModule
中也需要LinearAlgebra
,您会同时在(FooModule.jl
和doSomething.jl
)中编写它吗?这里的好做法是什么?大多数软件包都在顶级模块中使用或导入。简短而贴切的解释。如果导入模块(即线性代数
)需要做些什么呢请在doSomething.jl
或FooModule.jl
中使用LinearGebra对进行编码。此外,如果FooModule
中也需要LinearAlgebra
,您会同时在(FooModule.jl
和doSomething.jl
)中编写它吗?这里的好做法是什么?大多数软件包都在顶层模块中使用或导入。
julia> include("main.jl");
ERROR: LoadError: LoadError: LoadError: UndefVarError: Foo not defined
Stacktrace:
[1] include_from_node1(::String) at ./loading.jl:576
[2] include(::String) at ./sysimg.jl:14
[3] include_from_node1(::String) at ./loading.jl:576
[4] eval(::Module, ::Any) at ./boot.jl:235
[5] _require(::Symbol) at ./loading.jl:490
[6] require(::Symbol) at ./loading.jl:405
[7] include_from_node1(::String) at ./loading.jl:576
[8] include(::String) at ./sysimg.jl:14
while loading ~/Desktop/doSomething.jl, in expression starting on line 1
while loading ~/Desktop/FooModule.jl, in expression starting on line 6
while loading ~/Desktop/main.jl, in expression starting on line 1