如何在编辑后在活动的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会话)。
这适用于通过导入或使用引入范围的模块