Module 朱莉娅:把模块分割成多个文件

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

我使用的是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 # 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