Избыточное использование экспорта? - PullRequest
0 голосов
/ 18 марта 2019

Есть ли причина использовать «экспорт» в файле (который не содержит модулей), который будет включен в другой файл позже?Я столкнулся с этим типом использования экспорта при просмотре некоторых пакетов на 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 независимо, поэтомусделать использование «экспорта» совершенно ненужным?Я видел этот тип вещей в нескольких разных пакетах, и на самом деле не понимаю причину.

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

Ренато

1 Ответ

2 голосов
/ 18 марта 2019

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

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

Оператор include просто заставляет Джулию вычислять код в этоммодуль, так что вы можете думать о Bar.jl как о

# Bar.jl
module Bar
    export foo1

    function foo1()
        do something
    end

    function foo2()
        do something
    end

    other stuff
end

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

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

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

...