首页 > 解决方案 > 冗余导出使用?

问题描述

是否有任何理由在稍后将包含在另一个文件中的文件(不包含模块)中使用“导出”?在查看 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 的范围内,从而完全没有必要使用“导出”?我在几个不同的包中看到了这种类型的东西,但并没有真正明白原因。

非常感谢您的任何帮助,

雷纳托

标签: moduleexportjulia

解决方案


这些exports 不是多余的。这些exports 不是关于Bar导入的其他模块的范围,而是关于其他模块的范围Bar。如果您Bar通过using Barin 另一个模块或 in导入模块Main,则名称foo1将是公共的,因此您只需要编写foo1不带限定符即可访问该函数foo1而不是Bar.foo1.

如果您删除该export语句,Foo.jl您将看到foo1在发出 using Bar. 例如,您必须在该模块中编写Bar.foo1或显式显示,或者。foo1using Bar: foo1import 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语句将foo1in的名称导出Bar到导入该模块的其他模块Bar

您可以在 Julia 文档中找到有关导入、导出和模块系统的更多信息。

在一个模块中,您可以控制其他模块中的哪些名称是可见的(通过导入),并指定您的哪些名称是公开的(通过导出)。 https://docs.julialang.org/en/v1/manual/modules/index.html#modules-1


推荐阅读