在Julia-Lang中包含文件的正确方法,以便考虑更新

时间:2018-04-24 13:36:20

标签: julia

我承认刚接触朱莉娅。但是,通过查看各种文档,我无法找到适合我(可能非常简单)问题的答案。

我从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

这显然是错误的。

总结:我不知道处理分解在多个文件上的代码和开发过程中的更改的最佳过程。

1 个答案:

答案 0 :(得分:3)

最简单的方法是使用Modules代替includeRevise包。

通过调用`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