为什么Rust会使用显式导入来促进使用语句?

Chr*_*oph 6 rust

我看到很多Rust代码,其中的use语句如下所示:

use std::io::net::ip::{SocketAddr, Ipv4Addr};
Run Code Online (Sandbox Code Playgroud)

我得到它的方式,这限制use语句只导入SocketAddrIpv4Addr.

从Java或C#等语言的角度来看,这种语言很奇怪,因为import语句总是导入所有公共类型.

我想在Rust中使用此语句可以使用相同的内容.

use std::io::net::ip::*;
Run Code Online (Sandbox Code Playgroud)

我可以看到显式命名的唯一原因是避免两个不同的导入包含具有相同名称的公共API的冲突.但是,这可以通过别名来解决,所以我想知道更严格的"仅导入需要的"方法是否还有另一个优点?

Chr*_*gan 7

Rust受到Python的启发,它有一个类似的原则:导入是全部显式的,虽然支持glob导入(use x::*在Rust中,from x import *在Python中),但通常不建议使用它们.

这种理念确实有一些实际影响; 例如,调用trait方法只能在trait在范围内时才能完成,因此在导入的traits中存在名称冲突时调用trait方法相当困难(将来使用统一函数调用语法将进行改进) ,你可以打电话Trait::function(self)而不是只是self.function()).

但是,大多数情况下,它在Python的禅宗中得到了很好的体现:"显性优于隐性".当大量的东西在范围内时,很难看出来自何处的东西,并且对模块结构和/或工具的深入了解变得非常重要; 如果一切都是明确的,那么工具很大程度上是不必要的,在简单的文本编辑器中手工处理文件是完全可行的.当然,工具仍然能够协助,但它并不是必需的.

这就是Rust采用Python明确的导入哲学的原因.


小智 5

Huon 在其中写道

它们的某些方面极大地使名称解析算法复杂化(据我所知),无论如何,它们对实际代码有各种缺点,例如 Python 中的等价物令人不悦:http : //python.net/~goodger/项目/pycon/2007/idiomatic/handout.html#importing

也许它们在编译和静态类型语言中还不错?我不知道; 无论哪种方式,我个人都发现没有 glob 导入的代码更容易阅读,因为我可以很容易地确定调用哪个函数,而 glob 导入需要更多的努力。

nikomatsakis 写的地方

我认为 glob 进口有其一席之地。例如,在借用检查器中,有一个子模块的浅层树,所有子模块都使用borrowck/mod.rs. 需要手动导入所有这些名称似乎相当乏味和愚蠢,而不是仅仅编写 use rustc::middle::borrowck::*. 不过,我知道解析算法存在复杂性,我更愿意接受基于那里基本挑战的论点。

然后转移到RFC 305被 steveklabnik 拒绝,没有评论它们是否是好的风格:

Glob 导入现在稳定了,所以我要结束了。

  • 参考资料很棒,但只提供链接的答案。一旦这些网址失效,您的回答将毫无价值。如果您希望改进您​​的答案,请在此处写下内容(您可以引用),并且仅使用链接来备份答案并提供更多信息。 (2认同)