`dyn` 与绝对路径一起使用时出现错误 [E0433]
Error [E0433] when `dyn` used with absolute path
我在玩 Rust 1.27 中引入的 dyn
traits 时偶然发现了这个编译器错误:
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)
这是对 dyn
是上下文关键字这一事实的向后兼容性 "gotcha"。在添加新语法之前,您可以编写使用 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> { /* ... */ }
我在玩 Rust 1.27 中引入的 dyn
traits 时偶然发现了这个编译器错误:
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)
这是对 dyn
是上下文关键字这一事实的向后兼容性 "gotcha"。在添加新语法之前,您可以编写使用 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> { /* ... */ }