私は最近dyn
キーワードを使用したコードを見ました:
fn foo(arg: &dyn Display) {}
fn bar() -> Box<dyn Display> {}
この構文はどういう意味ですか?
TL; DR:特性オブジェクトのタイプを指定するための構文であり、明確にするために優先されるべきです。
Rust 1.0であるため、特性は二重の生命をもたらしました。特性が宣言されると、特性または型として使用できます。
// As a trait
impl MyTrait for SomeType {}
// As a type!
impl MyTrait {}
impl AnotherTrait for MyTrait {}
ご想像のとおり、この二重の意味は混乱を招く可能性があります。さらに、MyTrait
型はサイズが変更されていない/動的にサイズが変更されているため、非常に複雑なエラーメッセージが表示される可能性があります。
この問題を改善するために、 RFC 211 は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
構文を使用し、 traitオブジェクト のタイプを「明白な」特性構文からより明確に区別するよう努めています。
その後の Rustの編集 では、むき出しの構文が非推奨になり、最終的に削除される可能性があります。