Ошибка [E0433], когда `dyn` используется с абсолютным путем - PullRequest
0 голосов
/ 28 июня 2018

Я играл с чертами dyn, представленными в Rust 1.27 и наткнулся на ошибку компилятора:

error[E0433]: failed to resolve. Use of undeclared type or module `dyn`
 --> src\main.rs:1:30
  |
1 | fn _run0() -> Result<(), Box<dyn ::std::error::Error>> { Ok(()) }
  |                              ^^^ Use of undeclared type or module `dyn`

Все остальные варианты компилируются нормально:

fn _run0() -> Result<(), Box<dyn ::std::error::Error>> { Ok(()) } // Error

fn _run1() -> Result<(), Box<dyn std::error::Error>> { Ok(()) } // Ok

fn _run2() -> Result<(), Box<::std::error::Error>> { Ok(()) } // Ok

Это предполагаемое поведение?


rustc 1.27.0 (3eda71b00 2018-06-19)

1 Ответ

0 голосов
/ 28 июня 2018

Это обратная "совместимость" того факта, что dyn является контекстным ключевым словом. Перед добавлением нового синтаксиса вы можете написать этот код, который использует dyn в качестве имени модуля:

mod dyn {
    pub trait Error {}
}

fn example() -> Box<dyn ::Error> {
//                     ^ space doesn't matter
    unimplemented!()
}

Этот не может остановить компиляцию, поэтому он должен быть проанализирован как компонент пути.

Вы можете добавить круглые скобки, чтобы быть явным:

fn example() -> Box<dyn (::dyn::Error)> { /* ... */ }

В выпуске 2018 года вы можете использовать crate в начале пути:

fn example() -> Box<dyn crate::dyn::Error> { /* ... */ }
...