【问题标题】:Can `use std::io` break my code after update of `rustc`? [duplicate]更新 rustc 后可以使用 std::io 破坏我的代码吗? [复制]
【发布时间】:2022-01-02 18:35:37
【问题描述】:

我在 C++ 课后为了好玩而学习 rust,我想知道,use std::io 可以在将 rustc 版本更新到更新后破坏我的代码吗?

例如,在 C++ 中使用 using namespace std 是不好的,因为如果将新函数添加到 std,您的多个翻译单元代码可能会在编译器更新后中断,因为与您编写的函数名称相同的函数已添加到命名空间std.

但是在所有官方的 rust 教程中都使用了use std::io

use std::io 可以破坏我的代码吗?

【问题讨论】:

  • ??这没有任何意义,除非您导入特定的标识符,否则 rust 导入仍然必须是命名空间限定的。大约十年来我没有使用过 C++,但是 IIRC using namespace std; 很糟糕,因为没有资格将所有符号导入您当前的范围。注:您可以在 Rust 中使用星形导入,尽管 Rust 中没有任何东西像 C++ 中的 std 那样庞大,但它可能会遇到同样的问题。
  • @JaredSmith 好的,但是如果我们需要创建名为 io 的板条箱(例如,我们正在编写某种解析器/任何东西)并在其中放入一些函数,它可能会中断?
  • 首先,没有。不要以标准库中的模块命名 crates。其次,永远不要使用明星进口,你会没事的。
  • 所以约定只是不以 std 的部分名称命名 crate 和/或不使用星号导入?
  • @blonded04 没有理由你不能命名一个板条箱io,由此产生的任何困难都可能在任何两个板条箱/模块之间造成,我在实践中从未遇到过这样的问题.如果确实存在问题,您可以随时使用 ::io 消除 crate 的歧义。

标签: rust using rust-2021


【解决方案1】:

use std::io; 本身无法在版本之间破坏您的代码。该声明仅将 io 名称带入范围,并且不会改变。

如果你已经完成了use std::io::*;,这会将io 模块中的所有内容都带入类似于C++ 中use namespace std; 的范围,因此可能将来会破坏你的代码,但是通配符导入出于这个原因,一般不鼓励。

【讨论】:

    猜你喜欢
    • 2016-10-22
    • 1970-01-01
    • 2018-01-04
    • 2013-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-13
    • 1970-01-01
    相关资源
    最近更新 更多