Избыточное использование экспорта?

#module #export #julia

#модуль #экспорт #джулия

Вопрос:

Есть ли какая-либо причина использовать «экспорт» в файле (который не содержит модулей), который позже будет включен в другой файл? Я столкнулся с этим типом использования экспорта при просмотре некоторых пакетов на GitHub, что заставило меня задуматься. Например, рассмотрим Foo.jl:

 # Foo.jl
export foo1

function foo1()
    do something
end

function foo2()
    do something
end
  

Который включен в Bar.jl

 # Bar.jl
module Bar
    include("Foo.jl")

    other stuff
end
  

Не будет ли функция foo2() независимо находиться в области Bar, что делает использование «export» совершенно ненужным? Я видел подобные материалы в нескольких разных пакетах и на самом деле не понимаю причины.

Заранее большое спасибо за любую помощь,

Renato

Ответ №1:

Эти export файлы не являются избыточными. Эти export вопросы касаются не области Bar , а скорее областей других импортируемых модулей Bar . Если вы импортируете модуль Bar через using Bar в другом модуле или в Main , имя foo1 будет общедоступным, так что вам нужно только написать просто foo1 без уточнений для доступа к функции foo1 вместо Bar.foo1 .

Если вы удалите эту export инструкцию из Foo.jl , вы увидите, что вы больше не сможете получить доступ к функции foo1 без уточнения имени модуля после выпуска using Bar . Вам нужно либо написать Bar.foo1 , либо явно сделать foo1 видимым в этом модуле через, например, using Bar: foo1 или import Bar: foo1 .

include Инструкция просто заставляет Julia оценивать код в этом модуле, чтобы вы могли думать о Bar.jl так, как будто это

 # Bar.jl
module Bar
    export foo1

    function foo1()
        do something
    end

    function foo2()
        do something
    end

    other stuff
end
  

Таким образом, export инструкция экспортирует имя foo1 in Bar в другие модули, которые импортируют модуль Bar .

Вы можете найти более подробную информацию об импорте, экспорте и системе модулей в документации Julia.

Внутри модуля вы можете управлять тем, какие имена из других модулей видны (через импорт), и указывать, какие из ваших имен должны быть общедоступными (через экспорт). https://docs.julialang.org/en/v1/manual/modules/index.html#modules-1

Комментарии:

1. Это имеет смысл, и это на самом деле устраняет некоторые другие моменты замешательства, которые у меня тоже были. Большое спасибо!