为什么这里没有足够的使用std :: io`?

时间:2016-12-17 13:04:57

标签: rust

我尝试编译以下程序:

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中定义的所有名称?还有,这会是一种糟糕的风格吗?

1 个答案:

答案 0 :(得分:11)

  

use std::io;实际上做了什么?

它执行每个use-statement所做的事情:使用过的路径的最后一部分直接可用(将其拉入当前命名空间)。这意味着您可以编写io并且编译器知道您的意思是std::io

  

如何提取std::io中定义的所有名称?

use std::io::*;。这通常称为 glob-import

  

另外,这会是一种糟糕的风格吗?

是的,它会的。通常你应该避免使用glob-imports。它们在某些情况下可以派上用场,但在大多数情况下会造成很多麻烦。例如,还有特征std::fmt::Write ...因此从fmtio导入所有内容可能会导致名称冲突。 Rust重视隐含性的显式性,因此请避免使用glob-imports。

但是,有一种类型的模块通常与glob-import一起使用:prelude。事实上,甚至有一个std::io::prelude重新出现了重要的符号。有关详细信息,请参阅the documentation