【问题标题】:How do I import/call "subpackages" of packages?如何导入/调用包的“子包”?
【发布时间】:2020-02-11 02:51:33
【问题描述】:

我正在尝试使用 LinearAlgebra.jl 中的函数,该函数在 dense.jl file 中定义。

我预计它会加载 using LinearAlgebra,因为它是 LinearAlgebra 包 (julia/stdlib/LinearAlgebra/src/dense.jl) 的一部分。 然而,情况似乎并非如此。 从dense.jl 调用函数会引发“UndefVarError”,而来自LinearAlgebra.jl 主文件的函数可以正常工作。

所以: 如何从“子包”导入/调用函数?

【问题讨论】:

    标签: julia


    【解决方案1】:

    答案取决于函数是否是单独模块的一部分。但是,在这种情况下,您可以预先添加“LinearAlgebra”。到函数名称,因为问题可能只是默认情况下该函数没有通过 LinearAlgebra 模块导出到您的命名空间中:

    julia> using LinearAlgebra
    
    julia> isone
    isone (generic function with 13 methods)
    
    julia> _isone_cachefriendly
    ERROR: UndefVarError: _isone_cachefriendly not defined
    
    julia> LinearAlgebra._isone_cachefriendly
    _isone_cachefriendly (generic function with 1 method)
    

    【讨论】:

    • 这种行为对我来说似乎不一致。为什么我可以调用某些 LinearAlgebra 函数而不专门引用其名称空间而其他函数则不能?
    • 并不矛盾。您可以使用完全限定名称来引用所有名称。只有不是exported 的名字可以是不合格的
    • 这就是 Julia 实现封装的方式:它不使用对象,而是使用模块:模块的作者可以选择将哪些函数设计为“私有”(不导出)或“公共”(导出) )。正如@Bill 答案所示,您始终可以使用完全限定名称访问“私有”函数。
    猜你喜欢
    • 1970-01-01
    • 2014-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-07
    • 2021-10-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多