1. ホーム
  2. syntax

[解決済み] dyn」とは、どのような意味ですか?

2023-07-12 16:44:49

質問

最近 dyn キーワードを使用したコードを見ました。

fn foo(arg: &dyn Display) {}

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

この構文は何を意味するのでしょうか?

どのように解決するのですか?

TL;DR: 型を指定するための構文である trait オブジェクト の型を指定するための構文であり、明確化のために指定する必要があります。


Rust 1.0以降、traitは二重生活を送っています。一旦、特質が宣言されると、特質として、または型として使用することができます。

// 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 の構文に類似しており、また 形質オブジェクト の型を、"bare" trait 構文とより明らかに区別できるように努めています。

dyn は "dynamic" の略で、trait オブジェクトが以下を実行することを意味します。 動的なディスパッチ . つまり、どの関数を呼び出すかの決定は、プログラムの実行時に行われます。これと対照的なのが 静的ディスパッチ で、これは impl Trait の構文を使っています。

がない構文は dyn は現在では非推奨となっており、おそらく後続の 版の Rust では削除されるでしょう。