問題タブ [borrow-checker]
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 - 「長生きしない」所有値へのポインタを返す方法は?
次のコードがあります。
アイデアは、グラフが新しいノードを作成し、それをメソッドを呼び出す人に「貸与」することです。しかし、新しく作成された構造への参照を返す方法がわかりません。2 番目のリターンは正常に機能していますが、明らかに効果的ではありません。
ベクトルからノードを取り戻さずにノードを返す方法は?
rust - 特性を型パラメーターとして使用すると、借用チェッカーが失敗する
構造体の型パラメーターとして特性を使用する場合、借用チェッカーに問題があります。
出力は次のとおりです。
それでも、次の例は機能します。
2 番目の例は 1 番目の例のインスタンス化にすぎないため、これは私には非常に奇妙に見えますが、マクロを使用して同じことを (苦労して) 実装できる可能性があります。
クロージャーが受け取るパラメーターの型を知る必要があるため、これは非常に難しいと思いますが、この参照を保存する必要はありません...
これは借用チェッカーのバグですか? それとも私は何か間違ったことをしていますか?
編集1:ユースケースを正確に
編集 2: 以下の回答で説明されているように、問題は、借用チェッカーが の有効期間をObserver<&mut Type>
と同じにすることを強制する&mut Type
ことです。そのため、実際には、問題は型パラメーターとしてトレイトを使用するという事実とは関係ありません (実際の構造でも同じことを行います)。
したがって、私の場合、次のObserver<Arg>
ように定義することで回避策を講じることができます。
したがって、型パラメーター Arg 自体は参照ではありませんが、これによりコードの汎用性が低くなります。誰もがより良い解決策を持っていますか?
rust - 生のポインターを含む構造体の有効期間を強制するにはどうすればよいですか?
編集者注:このコードは、Rust 1.0 ではエラーでコンパイルされなくなりました
parameter `'a` is never used
。このエラーの理由は、以下に示す問題が原因であるため、(更新された) 解決策は引き続き適用可能です。
このコード ブロックは、いくつかの混乱を引き起こしています。
なぜこれがコンパイルされるのですか?
電話すると
の寿命を持つべきではありませんb
か?'a
の有効期間よりも有効期間が長いため、コンパイル エラーが発生することが予想されましたMutPtr<'b, Bar>
。
rust - &mut self からファイルを借用できません (エラー メッセージ: 借用したコンテンツから移動できません)
これをコンパイルすると、次のようになります。
なぜこうなった?解決するにはどうすればよいですか?
rust - 前の借用が「忘れられた」場合でもポインタを借用できませんか?
関数fn1がコンパイルされない理由、つまり「let z = &mut x;」の理由がわかりません。"y" に保存されている以前に取得された参照が使用されていない間は、割り当てられません ("y" は別のものに再割り当てされます)。
さらに、fn2とfn3の両方が「論理的に」同じことをしているのに、なぜ両方とも正常にコンパイルされるのでしょうか?
実際、 fn2はfn1とは異なります。「y」は再割り当てではなく範囲外になりますが、「y」が指すものに関してではなく、「y」ポインター ストレージに関してのみ異なります。
実際、 fn3はfn1とは異なり、"z" は "&mut x" から直接割り当てられるのではなく、"y" から割り当てられます。
reference - 借用したコンテンツから移動できない / 共有参照の背後から移動できない
エラーがわかりませんcannot move out of borrowed content
。私は何度もそれを受け取り、常に解決してきましたが、理由がわかりませんでした。
例えば:
エラーが発生します:
Rustの新しいバージョンでは、エラーは
クローンを作成して解決しましたline
:
次のような他の投稿を読んでも、エラーがわかりません。
この種のエラーの原因は何ですか?
rust - &mut self メソッドでメンバー変数をアンラップするときに、借用したコンテンツから移動できません
Rust で Disjoint-Set データ構造を作成しようとしていました。関連するコードは次のとおりです。
私が得るエラーは次のとおりです。
ボローチェッカーを完全に理解しているかどうかはわかりませんが、参照を使用して、構造体自体の所有権を取得しないようにして、他の言語と同じように構造体を指して再割り当てできるようにしています。
構造体の参照からを削除することでこれらのエラーを回避できますmut
が、各セットの親は不変であるため変更できません。
次のような同様の質問を読みました。
これらは、この問題を解決する方法を見つけるのに役立ちません。find
また、使用する構造体だけでなく関数も再構築しようとRc<RefCell<Set>>
しBox<Set>
ましたが、常に同じエラーが発生します。
このエラーは何ですか?どうすれば修正できますか?
reference - 所有権を譲渡しようとすると、借用したコンテンツから移動できません
Rust のライフタイム、所有権、および参照について理解するために、リンク リストを作成しています。次のコードがあります。
しかし、次のコンパイル エラーが発生します。
Rust の新しいバージョンには、わずかに異なるエラーがあります。
ノードは現在、リンクされたリストであるhead
によって所有されている必要があると考えています。self
に割り当てるとnew_node.next
、所有権の変更が発生する可能性があります。
無駄に思えるので、可能であれば値を複製したくありません。関数の期間中、単に「借りる」ことはしたくありません。私は本当にその所有権を譲渡したい。
それ、どうやったら出来るの?
&mut self メソッドでメンバー変数をアンラップするときに、借用したコンテンツから移動できないおよび借用したコンテンツから移動できない / 共有参照の背後から移動できないについては既に確認しました。
これらの質問の1つで受け入れられた回答で提案されているように、マッチアームを削除しnext
、新しいの作成で定義しようとしましLinkedListNode
たが、同じエラーメッセージが表示されます。
リストの最後に追加するappend
メソッドを正常に追加しました。LinkedListNode
rust - Vec の作成時に、借用した値が十分に長く存続しない
編集者注: この質問は Rust 1.0 より前に出されたものです。それ以来、特定の言語セマンティクスと同様に、多くの関数と型が変更されました。質問のコードはもはや有効ではありませんが、回答で表現されているアイデアは有効である可能性があります。
ディレクトリ内のファイルを一覧表示し、ファイル名を自分の にコピーしようとしていますVec
。私はいくつかの解決策を試しましたが、常に十分な長さの変数を作成できないという問題に終わります。私は自分の間違いを理解していません。
コンパイラが "x" について不平を言うのはなぜですか? 私は x を気にしません。その内部が必要で、静的&str
だと思いました。&str
私はこの方法を試しましたが、コンパイラが「パス」が十分に長くないと不平を言うことで同じ結果が得られました。
ここが遊び場です。