[解決済み] 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
では削除されるでしょう。
関連
-
[解決済み] JavaScriptで "use strict "は何をするのか、その根拠は?
-
[解決済み] パラメータに**(ダブルスター/アスタリスク)、*(スター/アスタリスク)がありますが、これはどういう意味ですか?
-
[解決済み] なぜ ++[[]][+[] +[+[]] は "10" という文字列を返すのでしょうか?
-
[解決済み] 誰かPythonで__all__を説明してくれませんか?
-
[解決済み] C言語における「static」の意味とは?
-
[解決済み] Pythonで改行(行継続)をするにはどうしたらいいですか?
-
[解決済み] Pythonの "at"(@)マークは何をするものですか?
-
[解決済み] 関数呼び出しにおけるstarとdoublestarの演算子の意味は?
-
[解決済み] Rubyのmap(&:name)ってどういう意味?
-
[解決済み] 様々な言語のコードをシンタックスハイライトするためのLaTeXパッケージ
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Go golang、シンタックスエラー: unexpected ++, expecting :
-
[解決済み] Markdownのコメント
-
[解決済み] IFステートメントを使用しているときに、シェルコマンドを複数行に分割するにはどうすればよいですか?
-
[解決済み】PowerShellで"&&"や"-and "を動作させることはできますか?
-
[解決済み] RustのtraitとHaskellのtypeclassの違いは何ですか?
-
[解決済み] 様々な言語のコードをシンタックスハイライトするためのLaTeXパッケージ
-
[解決済み] プログラミング言語における文法と意味の違いは何ですか?
-
[解決済み] オブジェクト初期化構文
-
[解決済み] 番号付きリストのコードブロック (Wiki構文)
-
[解決済み] Gherkinでコメントをブロックするには?