我在Julia中制作了两个模块。一种是绘制树木结构图,另一种是从代名词安全性估计熵。 第一个具有以下第一行:
module ArbolGrafosTikz
using LightGraphs, TikzGraphs
abstract type LabelledDiGraph
end
export LabelledTree, Nodo, Subarbol, Arbol,
walk_tree, walk_tree!, tikz_representation
struct LabelledTree <: LabelledDiGraph
g::DiGraph
labels::Vector{Any}
end
等。 第二个具有此标头:
module EntropySymb
using Base.Iterators
export simboliza, problock, ncartprod, issubvec, allprobsn
function simboliza(x, delta=epsi)
# funcion que pasa floats a tres simbolos.
result=0
if x>delta
等。
在我的主程序中,第一行是这样的:
push!(LOAD_PATH,".")
include("EntropySymb.jl")
include("ArbolGrafosTikz.jl")
using ArbolGrafosTikz
using EntropySymb
但是我只能直接访问ArbolGrafosTikz中的对象名称 直接来说,对于EntropySymb,我必须使用带有模块前缀的名称,否则Julia REPL似乎不了解它们。 为什么是这样?
答案 0 :(得分:1)
代码中的问题是,您首先include
个文件,这些文件已经将模块加载到Main
中,因此Main.EntropySymb
存在。这使得后续的导入语句using EntropySymb
返回错误
ERROR: importing EntropySymb into Main conflicts with an existing identifier
如果您已经将当前目录(或包含模块的目录)添加到LOAD_PATH
,则无需调用include
即可使用using
导入模块或import
。你可以简单地写
push!(LOAD_PATH, ".")
using ArbolGrafosTikz
using EntropySymb
如果您想使用include
,则应将using
与Main.ModuleName
或.ModuleName
结合使用,以将导出的名称纳入范围。
include("EntropySymb.jl")
include("ArbolGrafosTikz.jl")
using .ArbolGrafosTikz
using .EntropySymb
请注意,您也应该面对第一个模块的问题,但我想您之所以没有这样做,是因为代码的运行顺序与问题中给出的顺序有所不同,或者您实际上并未运行第一个{ {1}}语句。也许也可以在新的会话中尝试相同的代码来重现第一个模块的问题。
答案 1 :(得分:0)
您正遇到using
和import
之间的区别。 using MyModule
将MyModule
带入范围,而import MyModel
将所有导出的名称引入。