問題タブ [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.

0 投票する
2 に答える
489 参照

return - 早期に返却すると未払いの借入が終了しないのはなぜですか?

要素がベクトル内の最後の要素よりも大きい場合にのみ、並べ替えられたベクトルの末尾に要素をプッシュする関数を作成しようとしています。それ以外の場合は、最大の要素への参照でエラーを返します。私が知る限り、これは借用規則に違反しているようには見えませんが、借用チェッカーはそれを好まないのです。理由がわかりません。

なぜこれが機能しないのですか?


パオロ・ファラベラの答えに応えて。

次のように、return ステートメントのある関数を return ステートメントのない関数に変換できます。

の中へ

このことから、借用が のスコープを超えて存続することが明らかになり'innerます。

ボローチェックの目的で代わりに次の書き換えを使用することに問題はありますか?

return ステートメントは、それ以外の場合は借用規則に違反する可能性のあるその後の発生を排除することを考慮してください。

0 投票する
2 に答える
421 参照

rust - RefCell の問題を回避するにはどうすればよいですか?

2 つの C ポインターと 1 つの Rust を持つ構造体がありHashMapます。

私の構造体は として処理され、次のRc<RefCell<MyStruct>>ように呼び出される C 関数があります。

c_callC には、を必要とするの実行中に呼び出される Rust コールバックがありますが、 とmy_struct.borrow_mut()が必要なmy_structために既に借用されているため、 を取得します。c_callp1p2RefCell<T> already borrowed

問題は、変更できないことと、および の一部c_callへの不変のアクセスが必要なことです。p1p2borrow_mutmy_struct

MCVE は次のとおりです。

(ベビーサークル)

この問題を回避するにはどうすればよいですか?

0 投票する
0 に答える
23 参照

rust - 借用号を返す &format! パターンで

format!パターンマッチング後の結果を返そうとしていenumます:

しかし、これはうまくいきません:borrowed value does not live long enough

どうすればこれを解決できますか?

0 投票する
2 に答える
484 参照

iterator - ベクターを繰り返し処理しながら、ベクター内の別のアイテムを変更する方法はありますが、ベクター自体は変更できません。

ベクトルを繰り返し処理しても、ループ本体がベクトルを勝手に変更してはならないことは明らかです。これにより、バグが発生しやすいイテレータの無効化が防止されます。

ただし、すべての種類の突然変異が反復子の無効化につながるわけではありません。次の例を参照してください。

このような変更は のイテレータを無効にしませんがmy_vec、許可されていません。の特定の要素への参照が無効になる可能性がmy_vec[some_index]ありますが、いずれにしてもそのような参照は使用しません。

これらの質問がよくあることは承知しており、説明を求めているわけではありません。このループを取り除くことができるように、これをリファクタリングする方法を探しています。私の実際のコードでは、巨大なループ本体があり、これをうまく表現しないとモジュール化できません。

これまでに考えたこと:

  1. ベクトルを でラップしRc<RefCell<...>>ます。RefCellはイテレータによって借用され、ループ本体がそれを借用しようとすると失敗するため、これは実行時にまだ失敗すると思います。
  2. 一時的なベクトルを使用して将来のプッシュを蓄積し、ループの終了後にそれらをプッシュします。これは問題ありませんが、オンザフライでプッシュするよりも多くの割り当てが必要です。
  3. 安全でないコード、およびポインタのいじり。
  4. Iteratorドキュメントに記載されているものは役に立ちません。itertoolsをチェックアウトしましたが、どちらも役に立たないようです。
  5. while外側のベクトルへの参照を利用する反復子を使用する代わりに、ループとインデックスを使用します。これは問題ありませんが、イテレータとアダプタを使用できません。この外側のループを取り除き、 を使用したいだけですmy_vec.foreach(...)

これを適切に実行できるイディオムやライブラリはありますか? 安全でない関数は、ポインターを公開しない限り問題ありません。

0 投票する
0 に答える
54 参照

rust - Rustの借用チェッカーがdrop()を無視するのはなぜですか?

次のコードはコンパイルに失敗します。

エラーメッセージ:

これについては、借用チェッカーは明らかに正しいです。これを回避する方法は、明示的なスコープを使用することです。これにより、ラッパーが削除され、借用された含まれているオブジェクトが解放されます。

これは正しくコンパイルされます。

オブジェクトをスコープ外にするもう 1 つの方法は、std::mem::drop関数を使用することです。ただし、この場合は機能しません。

ボロー チェッカーは、以前と同じエラー メッセージを表示します。

drop(w)借りたものを解放しないのはなぜcですか?

0 投票する
3 に答える
780 参照

pointers - ペアの配列を関数に渡すときに、タイプ `&A` の特性が実装されていません

setRust LMDB ライブラリ( docs ) を呼び出す関数と、私が取り組んでいる例を作成しようとしています。

私は一生これを機能させることはできません。これが私の現在の試みです:

は次setのように定義されます。

これにより、次のエラーが吐き出されます。


も試しdb.set(id, note).unwrap();ましたが、今回は次のようになります。


私も次のようなものを試しました:

しかし、それもうまくいきません...理由は完全にはわかりません。タイプがidありませんか?note&strstr