我最近看过使用dyn关键字的代码:fn foo(arg: &dyn Display) {}fn bar() -> Box<dyn Display> {}这个语法是什么意思?
1 回答
POPMUISE
TA贡献1765条经验 获得超5个赞
TL; DR:这是用于指定特征对象类型的语法,出于清晰起见,应首选该语法。
从Rust 1.0开始,特质带来双重生活。声明了特征后,就可以将其用作特征或类型:
// As a trait
impl MyTrait for SomeType {}
// As a type!
impl MyTrait {}
impl AnotherTrait for MyTrait {}
可以想象,这种双重含义可能会引起一些混乱。另外,由于MyTrait类型是未调整大小/动态大小的类型,因此这可能使人们暴露于非常复杂的错误消息中。
为了改善此问题,RFC 2113引入了dyn语法。从Rust 1.27开始可以使用以下语法:
use std::{fmt::Display, sync::Arc};
fn main() {
let display_ref: &dyn Display = &42;
let display_box: Box<dyn Display> = Box::new(42);
let display_arc: Arc<dyn Display> = Arc::new(42);
}
这个新关键字与impl Trait语法相似,并致力于使特征对象的类型与“裸”特征语法更加明显。
- 1 回答
- 0 关注
- 544 浏览
添加回答
举报
0/150
提交
取消