web-dev-qa-db-ja.com

型の「dyn」とはどういう意味ですか?

私は最近dynキーワードを使用したコードを見ました:

fn foo(arg: &dyn Display) {}

fn bar() -> Box<dyn Display> {}

この構文はどういう意味ですか?

38
Shepmaster

TL; DR:特性オブジェクトのタイプを指定するための構文であり、明確にするために優先されるべきです。


Rust 1.0であるため、特性は二重の生命をもたらしました。特性が宣言されると、特性または型として使用できます。

// As a trait
impl MyTrait for SomeType {}

// As a type!
impl MyTrait {}
impl AnotherTrait for MyTrait {}

ご想像のとおり、この二重の意味は混乱を招く可能性があります。さらに、MyTrait型はサイズが変更されていない/動的にサイズが変更されているため、非常に複雑なエラーメッセージが表示される可能性があります。

この問題を改善するために、 RFC 211dyn構文を導入しました。この構文は、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の編集 では、むき出しの構文が非推奨になり、最終的に削除される可能性があります。

26
Shepmaster