冗余的导出用法?

时间:2019-03-18 03:37:36

标签: 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的范围,因此完全不需要使用“导出”吗?我在几种不同的包装中看到了这种类型的东西,但并没有真正了解原因。

非常感谢您的帮助,

Renato

1 个答案:

答案 0 :(得分:2)

这些export不是多余的。这些exportBar的范围无关,而是与导入Bar的其他模块的范围有关。如果您通过Bar在另一个模块或using Bar中导入模块Main,则名称foo1将是公用的,因此您只需要写foo1没有限定符即可访问函数foo1而不是Bar.foo1

如果从export中删除该Foo.jl语句,您将看到发出foo1之后,如果没有模块名称限定,就无法再访问函数using Bar。您必须编写Bar.foo1或通过foo1using 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中的Bar的名称导出到导入模块Bar的其他模块。

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

  

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