問題タブ [ownership-semantics]
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 - Rust はコピー可能でないスタック変数をどのように移動しますか?
ここに文書化された Rust の移動セマンティクスの優れた例があります: Rust By Example Web サイトのRust Move Semantics 。
私は両方のケースの基本的な理解を示しました。1 つ目は、プリミティブが新しいエイリアスを持つことができ、元のエイリアスを引き続き使用できる方法です。これは、最終結果がトレイトをi32
利用していると見なされるコピーであるためです。Copy
これは私には理にかなっています。
i32
さらに、多くの正当な理由により、2 番目の例は、ヒープ上のを参照する複数のエイリアスを持つという点で理にかなっています。Rust は所有権の規則を適用するため、新しいバインディングが作成されたので、元のエイリアスを使用することはできません。これにより、データ競合や二重解放などを防ぐことができます。
しかし、語られていない 3 番目のケースがあるようです。Rust は、トレイトを実装しないスタック割り当て構造体の移動をどのように実装しCopy
ますか? これを次のコードで示します。
これは私が知っていることです: 上記の場合、Rust は をEmployee
stackに割り当てます。上記の構造体は特性を実装していないCopy
ため、新しいエイリアスに割り当てられたときにコピーされません。Employee
構造体がスタックに割り当てられていて、トレイトを実装していない場合、どこCopy
に/どのように移動するのでしょうか? do_something()
のスタック フレームに物理的に移動しますか?
この難問を説明する上で、どんな助けも大歓迎です。
rust - 文字列を特定のライフタイムに複製
私は現在、Rust で小さなコマンド ライン アプリを作成しようとしていますが、ライフタイムの壁にぶつかりました。
username
問題は、デフォルト値メソッドに渡そうとしていることです。これにはstr
、有効期間が'r
. クローンを作成しようとしましたが、クローンの寿命がどうなるかを知る方法がわかりません。次の行に沿って何かを試しました:
何らかの理由でusername
、データのクローンを作成したので問題にならないはずなのに、それが十分に長く生きていないことを教えてくれます。
だから私の質問は、これをコンパイルするにはどうすればよいですか?
編集:署名が有効期間パラメーターとは別に同じままであることが私にとって重要であることを追加したいと思います。これを機能させるために、クローン作成などの高価な操作を行ってもかまいません。
winapi - Rust FFI による WinApi のより強力な安全性のエンコード
私はwinapi crateをいじっていますが、Windows API に安全性を追加することはないように思えます。単に型と署名を提供するだけのようで、ほとんど同じ安全でないパラダイムでプログラミングできますが、Rust を使用します。構文。
たとえば、Rust FFI でネイティブ型をさらに細分化して暗黙の有効期間情報をエンコードし、winapi プログラミングが実際により安全になるようにすることは可能ですか? winapi がポインターまたはハンドルに割り当てを行うときに、何らかの呼び出しで割り当てを解除/解放する必要がある場合Drop
、その値に対して正しい動作を適用できますか? Rust は十分に表現力がありますか?
もちろん、winapi 呼び出しを、呼び出し元と winapi の間でマップするより安全なオブジェクトで完全にラップすることもできますが、コピー/マッピング中にランタイム ヒットが発生し、面白くありません。
(おそらくそれは明らかですが、私はRust、WinApi、さらにはネイティブプログラミングも初めてです。)
通常、文字列データは Rust の UTF-8 に変換する必要があることを認識しています。しかし、Rustコードで必要でない限り、文字列がUTF-8に(透過的に)変換されないメモ化構造体でネイティブ文字列を自動的にラップすることが可能かどうか疑問に思います(vs単にWinApiに同じフォーマット)。
ハンドルとポインターは変換する必要はありませんが、適切な有効期間が必要なだけです。しかし、多くの種類のポインターと多くの種類のハンドルがあり、それらの型の違いは Rust で保持する必要があります。しかし、ライブラリ固有の free() をDrop
trait impl でエンコードするには、多くの順列があり、誰が割り当てたかを気にしない他の winapi 関数のオーバーロードが必要になると思います。右?
c++ - デストラクタC ++で所有者にアクセスする
を介してオブジェクト B を所有するオブジェクト A があるとしますstd::unique_ptr<B>
。さらに、B は A への生のポインタ (弱い) 参照を保持します。次に、A のデストラクタは、B を所有しているため、B のデストラクタを呼び出します。
B のデストラクタで A にアクセスする安全な方法は何でしょうか? (Aのデストラクタにもいる可能性があるため)。
A のデストラクタで B への強い参照を明示的にリセットして、B が予測可能な方法で破棄されるようにする安全な方法ですが、一般的なベスト プラクティスは何ですか?
rust - 値を移動したボックスを再利用するにはどうすればよいですか?
コピーできない型と、それを消費して(おそらく)生成する関数があります。
ここで、概念的に に非常に似ている型を考えてみましょうBox
。
NotBox
の内容を一時的に移動し、何かを戻す前に戻す関数を作成できます。
esで動作する類似の関数を書きたいのですBox
が、コンパイラはそれを好みません:
代わりに戻ることもできSome(Box::new(new_foo))
ますが、それは不必要な割り当てを実行します-私はすでにいくらかのメモリを自由に使用できます! それを避けることは可能ですか?
私もステートメントを取り除きたいのですmatch
が、コンパイラーはそれに満足していません(NotBox
バージョンであっても):
それを回避することは可能ですか?