rust - 为什么 Rust 提倡带有显式导入的 use 语句?

标签 rust

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

use std::io::net::ip::{SocketAddr, Ipv4Addr};

按照我的理解,这将 use 语句限制为仅导入 SocketAddrIpv4Addr

从 Java 或 C# 等语言的角度来看,这感觉很奇怪,因为对于这些语言,import 语句总是导入所有公共(public)类型。

我认为可以使用此语句在 Rust 中实现相同的效果。

use std::io::net::ip::*;

我能看到的明确命名的唯一原因是避免两个不同的导入包含具有相同名称的公共(public) API 的冲突。但是,这可以通过别名来解决,所以我想知道更严格的“仅导入所需内容”方法是否还有另一个优势?

最佳答案

Rust 在这方面受到 Python 的启发,Python 具有类似的原则:导入都是显式的,并且通过 glob 导入(在 Rust 中使用 x::*from x import * 在 Python 中)是受支持的,但通常不推荐使用它们。

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

不过,大多数情况下,这在 Python 的禅宗中得到了很好的表达:“显式优于隐式”。当大量的东西都在范围内时,可能很难看出什么来自哪里,并且对模块结构和/或工具的深入了解变得非常重要;如果一切都是明确的,那么工具在很大程度上是不必要的,并且在简单的文本编辑器中手动处理文件是完全可行的。当然,工具仍然可以提供帮助,但这不是必需

这就是为什么 Rust 采用了 Python 的显式导入哲学。

关于rust - 为什么 Rust 提倡带有显式导入的 use 语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23839699/

相关文章:

reference - RefCell<X> 和 RefCell<&X> 上的 borrow_mut 之间的区别

rust - 不能将 `hsets` 借为可变,因为它也被借为不可变

iterator - 为什么 Iterator::next 返回一个选项而不是一个项目?

ssl - 构建带 cargo 的箱子时 SSL 证书无效

enums - 将枚举的生命周期指定为返回类型

Rust 结构中的生命周期范围

rust - 如何检查一个东西是否在向量中

rust - 理解 Rust 中所有权的设计决策

rust - 如何让 Travis CI 与 Rust 0.12.0 和 Cargo 一起工作?

rust - 在对结构的引用上实现 hyper::Service