Julia仅从第一个自制模块导入名称

时间:2019-05-28 19:38:12

标签: module julia

我在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似乎不了解它们。 为什么是这样?

2 个答案:

答案 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,则应将usingMain.ModuleName.ModuleName结合使用,以将导出的名称纳入范围。

include("EntropySymb.jl")
include("ArbolGrafosTikz.jl")
using .ArbolGrafosTikz
using .EntropySymb

请注意,您也应该面对第一个模块的问题,但我想您之所以没有这样做,是因为代码的运行顺序与问题中给出的顺序有所不同,或者您实际上并未运行第一个{ {1}}语句。也许也可以在新的会话中尝试相同的代码来重现第一个模块的问题。

答案 1 :(得分:0)

您正遇到usingimport之间的区别。 using MyModuleMyModule带入范围,而import MyModel将所有导出的名称引入。