What does “dyn” mean in a type?
我最近看过使用
1 2 3 | fn foo(arg: &dyn Display) {} fn bar() -> Box<dyn Display> {} |
这个语法是什么意思?
TL; DR:这是用于指定特征对象类型的语法,出于清晰起见,应首选该语法。
从Rust 1.0开始,特质带来双重生活。声明了特征后,就可以将其用作特征或类型:
1 2 3 4 5 6 | // As a trait impl MyTrait for SomeType {} // As a type! impl MyTrait {} impl AnotherTrait for MyTrait {} |
可以想象,这种双重含义可能会引起一些混乱。另外,由于
为了改善此问题,RFC 2113引入了
1 2 3 4 5 6 7 | 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); } |
这个新关键字与
在后续的Rust版本中,裸语法可能会被弃用,然后最终被删除。
- 为什么我要在特征上实现方法而不是特征的一部分?
- 是什么使某物成为"特质对象"?