首页 > 解决方案 > 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 似乎不知道它们。为什么是这样?

标签: modulejulia

解决方案


您的代码中的问题是您首先include是文件,这些文件已经将模块加载到其中Main以便Main.EntropySymb存在。这使得后续的 import 语句using EntropySymb返回错误

ERROR: importing EntropySymb into Main conflicts with an existing identifier

如果您已经将当前目录(或包含模块的目录)添加到LOAD_PATH,则无需调用 to即可使用或include导入模块。你可以简单地写usingimport

push!(LOAD_PATH, ".")
using ArbolGrafosTikz
using EntropySymb

如果要include改用,则应使用usingwithMain.ModuleName.ModuleName将导出的名称带入范围。

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

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


推荐阅读