为什么不使用std :: {self,...};进行编译?

时间:2019-03-23 09:04:24

标签: rust

我不知道为什么不能用Rust 1.27.0编译此代码。

这是 test.rs ,因为它在我的硬盘上:

use std::{
  self,
  io::prelude::*,
  net::{ TcpListener, TcpStream },
};

fn main() {}

尝试使用rustc test.rs进行编译时的输出:

error[E0254]: the name `std` is defined multiple times
 --> test.rs:2:5
  |
2 |     self,
  |     ^^^^ `std` reimported here
  |
  = note: `std` must be defined only once in the type namespace of this module
help: you can use `as` to change the binding name of the import
  |
2 |     self as other_std,
  |     ^^^^^^^^^^^^^^^^^

warning: unused imports: `TcpListener`, `TcpStream`, `io::prelude::*`, `self`
 --> test.rs:2:5
  |
2 |     self,
  |     ^^^^
3 |     io::prelude::*,
  |     ^^^^^^^^^^^^^^
4 |     net::{TcpListener, TcpStream},
  |           ^^^^^^^^^^^  ^^^^^^^^^
  |
  = note: #[warn(unused_imports)] on by default

1 个答案:

答案 0 :(得分:5)

这在Rust 2018中很好用。您可能只想通过在pip install -r requirements.txt 上添加edition = "2018"或在Cargo.toml上添加--edition=2018来进行更新调用。下面是为什么在Rust 2015中这种方法不起作用的答案。


来自the std::prelude documentation

  

在技术层面上,Rust插件

     
rustc
     

进入每个板条箱的板条根,并且

     
extern crate std;
     

进入每个模块。

查看代码after macro expansion(例如通过use std::prelude::v1::*; )时,您也可以看到它的作用。对于您的代码,结果为:

cargo-expand

如您所见,由于#![feature(prelude_import)] #![no_std] #[prelude_import] use std::prelude::v1::*; #[macro_use] extern crate std; // No external crates imports or anything else. use std::{ self, net::{TcpListener, TcpStream}, }; fn main() { // Empty. } 语句,std已在范围内。因此,再次导入它会导致此错误。