在构建Julia模块时,“using”和“import”有什么区别?

85

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

我通过阅读文档的猜测: using 用于将另一个模块引入当前模块的名称空间中。import 用于将其他模块的特定类型/函数/变量引入当前模块的名称空间中。

那么,我的理解有多少错误呢?

3个回答

76
Julia的模块文档指出:

import关键字[...] 一次只操作一个名称,不像using那样增加要搜索的模块。 import还与using不同,因为必须使用import导入函数才能用新方法扩展。[...] 只能通过using看到名称的函数无法进行扩展

(强调是我的.)

例如,您可以使用import将方法添加到Base.show中以漂亮地打印自己的类型,但不能使用using
还有一个importall,它可以导入模块的所有导出名称。

(本答案适用于Julia 0.6;文档在1.0中重新措辞。)


2
非常清楚,谢谢 (+1+Tick)。实际上在我提出问题之前我就读到了那段话,但显然没有理解其含义。你的强调很有帮助。 - Colin T Bowers
3
“using”比“import”更加限制,因为它禁止名称被扩展。或许“using”有某些“import”无法实现的功能。 - Mr.Robot
当文档中说“只能通过using看到名称的函数无法扩展”时,这是什么意思?具体而言,在函数名称的上下文中,“可见”是什么意思? - Leonidas

62

关于这个的文档(适用于Julia 1.4的更新链接)非常出色。以下是我认为最简洁的摘要:

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

module MyModule

export x, y

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

end

(这是文档中的表格,但StackOverflow仍然不支持表格,因此进行了重新格式化)

命令

  • using MyModule
    • 在范围内:所有导出名称(xy),MyModule.xMyModule.yMyModule.p
    • 可扩展: MyModule.xMyModule.yMyModule.p
  • using MyModule: x, p
    • 在范围内:xp
    • 可扩展:(无)
  • import MyModule
    • 在范围内:MyModule.xMyModule.yMyModule.p
    • 可扩展:MyModule.xMyModule.yMyModule.p
  • import MyModule.x, MyModule.p
    • 在范围内:xp
    • 可扩展:xp
  • import MyModule: x, p
    • 在范围内:xp
    • 可扩展:xp

1
我的脑袋炸了...我没想到现在的using可以允许导入扩展。 - phipsgabler

6
以下是对主要区别的总结,我认为很容易记住:
1. 使用“using NiceStuff”可以在不使用模块限定符的情况下访问导出名称,而“import NiceStuff”则不能。 2. “import NiceStuff: nice”允许对指定函数进行扩展(添加方法),而不需要使用模块限定符,而“using NiceStuff: nice”则不能。
另外还有一个小区别: 使用“using”和“import”都允许使用“X as Y”语法来重命名标识符,但是对于模块名称本身,“import Random as Rnd”是允许的,而“using Random as Rnd”则是错误的。
以下是我从Modules docs page中发现的其他有用的信息:
- 只有使用“using ModuleName”时,导出列表才有意义。 - “import NiceStuff”等效于“using NiceStuff: NiceStuff”。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接