我承认刚接触朱莉娅。但是,通过查看各种文档,我无法找到适合我(可能非常简单)问题的答案。
我从Matlab知道
考虑名为src/
和main.m
的文件夹anotherfunc.m
中的两个文件
function main
anotherfunc(0)
end
和
function anotherfunc(x)
disp(sin(x))
end
我会在命令窗口中运行main
并查看所需的结果(=0
)。现在,也许我改变了主意并且更喜欢
function otherfunc(x)
disp(cos(x))
end
我再次运行main
并看到1
。
我不了解朱莉娅 怎么做完全相同的事情。 我尝试了两种我认为有效的方法。
1)
文件为anotherfunc.jl
:
function anotherfunc(x)
print(sin(x))
end
和(在同一目录中)main.jl
:
function main()
anotherfunc(0)
end
现在我在终端中启动julia
并写入
julia> include("anotherfunc.jl")
anotherfunc (generic function with 1 method)
julia> include("main.jl")
main (generic function with 1 method)
julia> main()
0.0
好。现在我将sin
更改为cos
并获取
julia> main()
0.0
这并不让我感到惊讶,我知道我需要另一个include
,即
julia> include("anotherfunc.jl")
anotherfunc (generic function with 1 method)
julia> main()
1.0
所以这很有效,但似乎很容易出错,我将在将来忘记包含。
2) 我以为我会很聪明并且写
function main
include("anotherfunc.jl")
anotherfunc(0)
end
但是关闭julia
并再次启动
julia> main()
ERROR: MethodError: no method matching anotherfunc(::Int64)
The applicable method may be too new: running in world age 21834, while current world is 21835.
Closest candidates are:
anotherfunc(::Any) at /some/path/anotherfunc.jl:2 (method too new to be called from this world context.)
Stacktrace:
[1] main() at /some/path/main.jl:4
这显然是错误的。
总结:我不知道处理分解在多个文件上的代码和开发过程中的更改的最佳过程。
答案 0 :(得分:3)
最简单的方法是使用Modules
代替include
和Revise
包。
通过调用`Pkg.add(“Revise”)
安装Revise.jl
我们在您的工作目录或其他目录中的Module
中有以下MyModule.jl
。
module MyModule
export anotherfunc
function anotherfunc(x)
display(sin(x))
end
end
首先,确保存储模块的目录位于LOAD_PATH
。默认情况下,Julia的工作目录未添加到LOAD_PATH
,因此如果您将模块放在工作目录中,请拨打push!(LOAD_PATH, pwd())
,否则请致电push!(LOAD_PATH, "/path/to/your/module")
。您可以将此代码添加到.juliarc
文件中,以便不为您运行的每个julia
实例调用此代码。
现在我们有以下主文件。
using Revise # must come before your module is loaded.
using MyModule
anotherfunc(0)
现在更改您的文件MyModule.jl
,以便anotherfunc
使用cos
代替sin
并查看结果。
我建议您阅读https://docs.julialang.org/en/stable/manual/modules/和https://github.com/timholy/Revise.jl