在构建模块时,在 Julia 中“使用”和“导入”的区别是什么?

问: 当我构建自己的模块时,在 Julia 中 usingimport有什么区别?

根据阅读文档的结果,我的猜测是: using用于将另一个模块放入当前模块的名称空间中。import用于将来自其他模块的特定类型/函数/变量放入当前模块的名称空间。

我错得有多离谱?

24274 次浏览

Julia 模块文档指出:

仅使用 import关键字[ ... ] < em > 在同一时间 操作单个名称 搜索的方式 using做。 import也不同于 using在这方面 函数必须使用 import < em > 导入,才能使用 new 进行扩展 方法 . [ ... ] 名称只能通过 using可见的函数不能扩展.

(重点是我的)

例如,可以使用 importBase.show添加方法来完美打印自己的类型,但不能使用 using

还有导入模块所有导出名称的 importall

(这个答案指的是 Julia 0.6; 文档改写为1.0。)

关于这一点的 文件(Julia 1.4的更新链接)非常棒。下面是我发现的最简洁的摘要:

(一个演示模块,使下面的例子具体)

module MyModule


export x, y


x() = "x"
y() = "y"
p() = "p"


end

(这是文档中的一个表,但 StackOverflow 仍然不会添加对表的支持,所以... ... 重新格式化了)

命令

    • In-scope: 所有导出的名称(xy)、 MyModule.xMyModule.yMyModule.p
    • 可扩展: MyModule.xMyModule.yMyModule.p
    • 适用范围: xp
    • 可扩展的: (无)
    • 适用范围: MyModule.xMyModule.yMyModule.p
    • 可扩展: MyModule.xMyModule.yMyModule.p
    • 适用范围: xp
    • 可扩展: xp
    • 适用范围: xp
    • 可扩展: xp

以一种我觉得很容易记住的方式总结一下主要的区别:

  1. using NiceStuff允许 用途在没有模块限定符的情况下访问导出的名称,而 import NiceStuff不允许;
  2. import NiceStuff: nice允许 分机在没有模块限定符的情况下访问指定的函数(添加方法) ,而 using NiceStuff: nice不允许。

还有一个小小的区别:
对于同时具有 usingimport(using Random: randstring as rstrimport Random: randstring as rstr)的单个标识符,允许使用 X as Y语法,但对于模块名称本身,允许使用 import Random as Rnd,而 using Random as Rnd是一个错误。

我从 模块文档页中发现的其他一些有用的观点

using ModuleName是唯一一种与出口清单有关的表格。

import NiceStuff等于 using NiceStuff: NiceStuff