Почему `` std :: {self, ...}; "не компилируется? - PullRequest
1 голос
/ 23 марта 2019

Я понятия не имею, почему этот код не может быть скомпилирован с 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 Ответ

5 голосов
/ 23 марта 2019

Это прекрасно работает в Rust 2018. Возможно, вы просто хотите обновить, добавив edition = "2018" к вашему Cargo.toml или --edition=2018 к вашему rustc вызову.Ниже приведен ответ, почему это не работает в Rust 2015.


С документация std::prelude :

На техническом уровне, Rust вставляет

extern crate std;

в корень ящика каждого ящика и

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 уже находится в области видимости из-за оператора extern crate std;.Таким образом, импорт в другой раз приводит к этой ошибке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...