Юлия импортирует только имена из первого самодельного модуля - PullRequest
0 голосов
/ 28 мая 2019

Я сделал два модуля в Юлии. Один из них предназначен для построения графиков структур деревьев, а другой - для оценки энтропии по симболическим последовательностям. Первая имеет следующие первые строки:

  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 я должен использовать имя с префиксом модуля, или Джулия REPL, кажется, не знает о них. Почему это?

Ответы [ 2 ]

1 голос
/ 28 мая 2019

Проблема в вашем коде состоит в том, что вы сначала 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

Обратите внимание, что вы также должны столкнуться с проблемой для первого модуля, но я думаю, что причина, по которой вы этого не сделаете, заключается в том, что код запускается в несколько ином порядке, чем тот, который приведен в вопросе, или вы на самом деле не запускали первый include заявление. Возможно, попробуйте тот же код в новом сеансе, чтобы воспроизвести проблему и для первого модуля.

0 голосов
/ 28 мая 2019

Вы столкнулись с разницей между using и import. using MyModule переносит MyModule в область действия, но import MyModel переносит все экспортированные имена.

...