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



我正在使用 Rust 1.27 中引入的dyn特征,并偶然发现了这个编译器错误:

error[E0433]: failed to resolve. Use of undeclared type or module `dyn`
--> srcmain.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(

这是一个向后兼容的"陷阱",因为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> { /* ... */ }

最新更新