如何在编辑后在活动的Julia会话中重新加载模块?

我有一个文件“/SomeAbsolutePath/ctbTestModule.jl”,其内容是:

module ctbTestModule export f1 f1(x) = x + 1 end 

我在运行“〜/ .juliarc.jl”的terminal上启动了Julia。 启动代码包含以下行:

 push!(LOAD_PATH, "/SomeAbsolutePath/") 

因此,我可以立即键入到朱莉娅控制台:

 using ctbTestModule 

加载我的模块。 正如所料, f1(1)返回2 。 现在我突然决定要编辑f1 。 我在编辑器中打开“/SomeAbsolutePath/ctbTestModule.jl”,并将内容更改为:

 module ctbTestModule export f1 f1(x) = x + 2 end 

我现在尝试在我活跃的Julia会话中重新加载模块。 我试试

 using ctbTestModule 

f1(1)仍然返回2 。 接下来我尝试:

 reload("ctbTestModule") 

如此处所示 ,但f1(1)仍然返回2 。 最后,我尝试:

 include("/SomeAbsolutePath/ctbTestModule.jl") 

如这里所build议的那样,这是理想的,因为我必须键入完整的绝对path,因为当前目录可能不是“/ SomeAbsolutePath”。 我得到警告消息Warning: replacing module ctbTestModule听起来很有希望,但f1(1)仍然返回2

如果我closures当前的Julia会话,启动一个新的,并using ctbTestModule ,我现在得到所需的行为,即f1(1)返回3键入。 但显然我想这样做, 而不重新启动茱莉亚。

那么,我做错了什么?

其他细节:Ubuntu 14.04上的Julia v0.2。

这个问题的基础是重装一个模块,但不能在模块Main中重新定义一个东西( 见这里的文档 ) – 至less在7月13 日新函数工作区()最近版本的0.3预发布应该有它。

之前工作区()

考虑下面的简单模块

 module TstMod export f function f() return 1 end end 

然后用它….

 julia> using TstMod julia> f() 1 

如果函数f ()更改为返回2并重新加载模块,则实际上会更新f 。 但是不能在模块Main中重新定义。

 julia> reload("TstMod") Warning: replacing module TstMod julia> TstMod.f() 2 julia> f() 1 

以下警告使问题清楚

 julia> using TstMod Warning: using TstMod.f in module Main conflicts with an existing identifier. julia> using TstMod.f Warning: ignoring conflicting import of TstMod.f into Main 

使用工作区()

但是,新的函数工作区 ()清除主要准备重新加载TstMod

 julia> workspace() julia> reload("TstMod") julia> using TstMod julia> f() 2 

另外,前面的Main被存储为LastMain

 julia> whos() Base Module Core Module LastMain Module Main Module TstMod Module ans Nothing julia> LastMain.f() 1 

恕我直言,更好的方法是从一开始就使用import ,而不是用于报告的问题。

考虑这个模块:

 module ModuleX1 export produce_text produce_text() = begin println("v1.0") end println("v1.0 loaded") end 

然后在REPL中:

 julia> import ModuleX1 v1.0 loaded julia> ModuleX1.produce_text() v1.0 

更新模块的代码并保存:

 module ModuleX1 export produce_text produce_text() = begin println("v2.0") end println("v2.0 loaded") end 

接下来,在REPL中:

 julia> reload("ModuleX1") Warning: replacing module ModuleX1 v2.0 loaded julia> ModuleX1.produce_text() v2.0 

使用import优点:

  • 避免在函数调用中产生歧义(在调用之后要调用:ModuleX1.produce_text()或produce_text())?
  • 不必调用workspace()以消除歧义

Disadvantes使用import过度using

  • 每个输出名称的每次调用都需要一个完全限定的名称

已编辑:根据下面的对话,从“缺点…”中删除了“对模块的完全访问权限,即使对于未导出的名称”也是如此。

在julia v0.6.0中 ,似乎不再需要使用workspace() :我可以简单地在活动REPL会话中重新加载(MyModule) ,并且它按预期工作(对包含MyModule的源文件进行的chage反映在活动REPL会话)。

这适用于通过导入使用引入范围的模块