問題タブ [trait-objects]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
rust - オプションに特性オブジェクトへの参照を入れる方法は?
io::Write
構造体の内部に特性オブジェクトへの参照を保存したいのですが、Option
方法がわかりません。次のように直接参照を入れることができます。
次に、(たとえば)次のBufWriter
ように割り当てます。
これは機能しますが、オプションにしたいと思いlogstream
ます。私が試してみると:
と
私は得る:
ここで適切なアプローチは何ですか?
casting - Rc 特性オブジェクトを複製して別の特性オブジェクトにキャストするにはどうすればよいですか?
これは、さまざまな taits 間の Rust 動的キャスト トレイト オブジェクトからのフォローアップの質問です。Rc
そこで提供されたソリューションは、特性オブジェクトの参照を使用する場合に非常にうまく機能しますが、今回はポインターで同じことをしようとしています。例えば
- という名前のスーパー トレイトと、and という名前
TraitAB
の 2 つのトレイトがTraitA
あります。TraitB
TraitAB
そのため、を使用する代わりに型の特性オブジェクトを最初に作成するときは、ポインターBox
を使用するようになりました。Rc
TraitA
参照するタイプの変数が必要ですab
ここで私は非常に最小限の例を作りました:
しかし、これはうまくいきません。エラーメッセージによると:
as_a
as_b
self が実際にはRc
ポインタであることを知ることはできません。複製された共有ポインタのキャストを行う方法はありますか?
generics - &(?Sized + Trait) を &dyn Trait にキャストできないのはなぜですか?
以下のコードでは、同じ特性を実装する動的サイズの型への参照から特性オブジェクトへの参照を取得することはできません。これはなぜですか?&dyn Trait
と&(?Sized + Trait)
両方を使用してトレイト メソッドを呼び出すことができる場合の違いは何ですか?
実装する型は、FooTraitContainerTrait
たとえば havetype Contained = dyn FooTrait
またはtype Contained = T
where T
is を実装する具体的な型である可能性がありますFooTrait
。どちらの場合も、 を取得するのは簡単&dyn FooTrait
です。これが機能しない別のケースは考えられません。の一般的なケースでこれが可能でないのはなぜFooTraitContainerTrait
ですか?
行のコメントを外すfoo_dyn(some_foo)
と、コンパイラ エラーが発生する
rust - 特性オブジェクトまたはサイズのない型のタプルを反復処理する方法
この質問は、最初は reddit のこの投稿で見つかりました。
経験豊富な Rust ユーザーは、タプル内の要素が同じである必要がないことに気付くでしょう (同じ場合は、配列を使用する必要があります!)。そのため、それらを繰り返し処理しても意味がありません。便利です。
これらのケースは、タプルの型を同じサイズのない型 ([u8]
または などdyn Trait
) にキャストできる場合です。
デモストレーション:
上記の美しい書き方が見つかりませんでした。何か案が?
十分に美しくない可能性のある答えを確認するには、次のようにします。