問題タブ [borrowing]

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 投票する
1 に答える
266 参照

vector - 変更可能なベクトルから最後の要素を複製し、値を Rust のベクトルにプッシュする方法は?

変更可能なベクトルから最後の要素を複製し、値を Rust のベクトルにプッシュする方法は?

エラーは

私はこれを読ん試しました

そしてまた

それでも失敗しました。

また、まだ.cloned()実装されてRoot<T>いません。

変更可能なベクトルから最後の要素を複製し、値を Rust のベクトルにプッシュする方法はありますか? Clonedまたは、最初に特性を実装する必要がありますか?

0 投票する
1 に答える
101 参照

rust - 借りた値への代入を許可しないことで、コンパイラはどのような災害を防ぎますか?

Programming in Rust (PDF)の例:

コンパイラはこれを許可しません:

しかし、それがあったとしましょう。それはどうですか

pは、&String選択した int であるメモリを指している です!

悪いことですか?

0 投票する
1 に答える
1351 参照

reference - 可変参照ではなく、不変参照を BufReader に渡すことができるのはなぜですか?

単純な TCP ベースのエコー サーバーを作成しています。を使用BufReaderBufWriterて a から読み書きしようとしたとき、 aを値で渡すとその所有権が移動し、 a に渡すことができないことがTcpStreamわかりました。次に、このスレッドで問題を解決する答えを見つけました。TcpStreamBufReader::new()BufWriter

これは簡単で、うまくいきます。ただし、このコードが機能する理由がよくわかりません。可変参照ではなく、不変参照を に渡すことができるのはなぜBufReader::new()ですか?

プログラム全体はここにあります。

詳細

上記のコードでは、 を使用しreader.read_line(&mut message)ました。BufReadそれで、Rust標準ライブラリのソースコードを開いて、これを見ました:

&mut BufReaderここで、自己 (私の場合は a かもしれません) を に渡していることがわかりますread_until()。次に、同じファイル内に次のコードを見つけました。

この部分では、BufReader:r.fill_buf()とを使用している場所が 2 つありr.consume(used)ます。私r.fill_buf()が見たいものだと思いました。BufReaderしたがって、 Rust標準ライブラリのコードに行き、これを見つけました:

self.inner.read(&mut self.buf)からデータを読み取るために使用しているようself.innerです。BufReader次に、との構造を見てみましょうBufReader::new()

inner上記のコードから、が を実装する型であることがわかりますRead。私の場合、inner&TcpStream.

の署名Read.read()は次のとおりです。

ここでは可変参照が必要ですが、不変参照のみを貸与しました。self.inner.read()プログラムが に到達したとき、これは問題になるはずfill_buf()ですか?

0 投票する
1 に答える
997 参照

iterator - Rust Inspect Iterator: `*` は可変としても借用されるため、不変として借用できません

push中にこのベクトルにアクセスして、中にそれinspectを実行できないのはなぜですか?containsskip_while

Chain次のように、独自の構造体に独自のイテレータを実装しました。

takeイテレータが一意の値を生成している間にやりたいこと。だから私はinspectチェーンを -ing し、ベクトルにプッシュしてからtake_whileスコープでチェックしています:

ただし、Rust コンパイルは次のエラーを吐き出します。

明らかに、「借りる」という概念を理解していません。私は何を間違っていますか?

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

rust - 借用した値を列挙型に埋め込みますか?

次のコードに問題があります。

(再生リンク)

HelloPhrase実装する言語、英語、ロシア語などの特性です。Phrasesマネージャー構造体であり、言語からフレーズへの多くのマップを持つことができます。これは不自然な例ですが、これをイベント マネージャー (つまり、X 入力のイベント ハンドラーを取得する)、または HTTP ハンドラーおよびルーターと考えることができます。

そうは言っても、 a の所有権を借りHelloPhraseて呼び出し元に返す方法を理解するのに苦労しています。実行すると、次のエラーが返されます。

私は追加しようとしました:

(再生リンク)

次のエラーが発生します。

列挙型にライフタイムを追加するのに問題があります-理論的には、戻り値のライフタイムを構造体のライフタイムにしたいのですPhrasesが、ライフタイムの構文はこれまでのところ非常に混乱しています。これを 2 つの質問にまとめると、次のようになります。

  1. GetHelloResultこのエラーを満たすために、 にライフタイムを追加するにはどうすればよいですか?
  2. Rust の所有規則に基づいて、Rust でアンチパターンを実行しようとしていますか? このようなものには、どのようなデザインが適しているでしょうか?

ドキュメントに基づいて、構造体でライフタイムを使用する方法は知っていますが、列挙型にライフタイムを追加する方法はわかりません (構文に関して)。構造体の有効期間についてだけ言及したのは、それが欠けている部分だと思うからですが、正直なところわかりません。hello_phrasesさらに、構造体と実装にライフタイムを追加してマップに追加しようとすると、エラーが発生します

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

rust - 「一度に複数回可変として変数を借りることはできません」というエラーを回避するには、グラフ コードを再構築する方法を教えてください。

正常にコンパイルされる単純なグラフがあります。

しかし、私がそれを使用するとコンパイルに失敗します:

エラー:

同様の質問をすべて見ました。Graph::add_node()メソッドが を使用しているため、それが失敗していることはわかっています&mut self。同様のすべての質問で、一般的な答えは「コードを再構築する」です。理解できません どうすればいいですか?このコードを再構築するにはどうすればよいですか?

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

rust - トラバーサルでの RefCell 借用の循環参照

私はRustを学んでいて、双方向リンクリストをコーディングしてみました。しかし、私はすでに典型的な反復トラバーサルの実装に行き詰まっています。ボロー チェッカー/ドロップ チェッカーが厳しすぎて、ボローが から関数の境界を越えたときに、ボローの正しい有効期間を推測できないという印象を受けていますRefCellcurr変数バインディング (この場合) を現在のコンテンツの借用に繰り返し設定する必要があります。

コンパイラは不平を言います:

NLLなし

NLLあり

この問題に対する反復的な解決策非再帰的)を本当に感謝します。

0 投票する
1 に答える
138 参照

rust - ループ内のローカルの借用をリセットできますか?

大きなルックアップ テーブルへのポインタを必要とする処理ループがあります。残念なことに、ポインタはソース データから 3 重に間接化されているため、内部ループのためにそのポインタを維持することがパフォーマンスにとって不可欠です。

万一状態を変更する必要がある場合に状態変数を「借用解除」していることを借用チェッカーに伝える方法はありmodify_stateますか?関数がトリガーされた場合にのみスライスを再検索できますか?

私が考えた 1 つの解決策は、データをスライス参照に変更しmem::replace、関数の先頭で構造体に対して a を実行し、スライスをローカル スコープにプルしてから、関数の最後で元に戻すことでしたが、これは非常に脆弱です。エラーが発生しやすい(返品のたびにアイテムを交換することを覚えておく必要があるため). これを達成する別の方法はありますか?

0 投票する
1 に答える
848 参照

rust - 2 つのベクトルをマージしながら照合する場合の「移動された値の使用」

カウントを持つタグのベクトルのマージ関数を作成していますが、借用エラーが発生しています。

エラーが発生します:

同様のエラーがv2. 通常、問題の場所と問題の原因となった以前の移動が表示されますが、ここには表示されません。

私は多くの順列を試しましたが、次の変更でコンパイルできましたが、すべてのクローン作成とタプルの再作成、およびOptions の再作成に満足していません。

誰かが借用チェッカーの挑戦を探している場合に備えて、参考までに、私が本当に書きたいことを追加します。

(v1, v2)各パスが強制的にv1およびに設定されるように、一致 オン は値を移動する必要があることに注意してくださいv2。まだ Haskell ほどきれいではありませんが、より近いです。