我尝试编译以下程序:
use std::io;
fn main() {
io::stdout().write(b"Please enter your name: ");
io::stdout().flush();
}
不幸的是,编译器拒绝了:
error: no method named `write` found for type `std::io::Stdout` in the current scope
--> hello.rs:4:18
|
4 | io::stdout().write(b"Please enter your name: ");
| ^^^^^
|
= help: items from traits can only be used if the trait is in scope; the following trait is implemented but not in scope, perhaps add a `use` for it:
= help: candidate #1: `use std::io::Write`
我发现我需要做use std::io::{self, Write};
。 use std::io;
实际上做了什么以及如何(如果可能的话)拉出std::io
中定义的所有名称?还有,这会是一种糟糕的风格吗?
答案 0 :(得分:11)
use std::io;
实际上做了什么?
它执行每个use-statement所做的事情:使用过的路径的最后一部分直接可用(将其拉入当前命名空间)。这意味着您可以编写io
并且编译器知道您的意思是std::io
。
如何提取
std::io
中定义的所有名称?
use std::io::*;
。这通常称为 glob-import 。
另外,这会是一种糟糕的风格吗?
是的,它会的。通常你应该避免使用glob-imports。它们在某些情况下可以派上用场,但在大多数情况下会造成很多麻烦。例如,还有特征std::fmt::Write
...因此从fmt
和io
导入所有内容可能会导致名称冲突。 Rust重视隐含性的显式性,因此请避免使用glob-imports。
但是,有一种类型的模块通常与glob-import一起使用:prelude。事实上,甚至有一个std::io::prelude
重新出现了重要的符号。有关详细信息,请参阅the documentation。