当`dyn`与绝对路径一起使用时出错[E0433]

mag*_*ras 6 dynamic-dispatch language-lawyer rust

我正在玩dynRust 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`
Run Code Online (Sandbox Code Playgroud)

所有其他变种编译正常:

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
Run Code Online (Sandbox Code Playgroud)

这是打算行为吗?


rustc 1.27.0(3eda71b00 2018-06-19)

She*_*ter 10

这是一个向上兼容性的"陷阱"事实dyn是一个上下文关键字.在添加新语法之前,您可以编写此代码dyn作为模块名称:

mod dyn {
    pub trait Error {}
}

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

不能停止编译,因此必须将其解析为路径组件.

您可以添加括号以显式:

fn example() -> Box<dyn (::dyn::Error)> { /* ... */ }
Run Code Online (Sandbox Code Playgroud)

在2018年版中,您可以crate在路径的开头使用:

fn example() -> Box<dyn crate::dyn::Error> { /* ... */ }
Run Code Online (Sandbox Code Playgroud)