問題タブ [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.
vector - 変更可能なベクトルから最後の要素を複製し、値を Rust のベクトルにプッシュする方法は?
変更可能なベクトルから最後の要素を複製し、値を Rust のベクトルにプッシュする方法は?
エラーは
私はこれを読んで試しました
そしてまた
それでも失敗しました。
また、まだ.cloned()
実装されてRoot<T>
いません。
変更可能なベクトルから最後の要素を複製し、値を Rust のベクトルにプッシュする方法はありますか? Cloned
または、最初に特性を実装する必要がありますか?
rust - 借りた値への代入を許可しないことで、コンパイラはどのような災害を防ぎますか?
コンパイラはこれを許可しません:
しかし、それがあったとしましょう。それはどうですか
今
p
は、&String
選択した int であるメモリを指している です!
悪いことですか?
reference - 可変参照ではなく、不変参照を BufReader に渡すことができるのはなぜですか?
単純な TCP ベースのエコー サーバーを作成しています。を使用BufReader
しBufWriter
て a から読み書きしようとしたとき、 aを値で渡すとその所有権が移動し、 a に渡すことができないことがTcpStream
わかりました。次に、このスレッドで問題を解決する答えを見つけました。TcpStream
BufReader::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()
ですか?
iterator - Rust Inspect Iterator: `*` は可変としても借用されるため、不変として借用できません
push
中にこのベクトルにアクセスして、中にそれinspect
を実行できないのはなぜですか?contains
skip_while
Chain
次のように、独自の構造体に独自のイテレータを実装しました。
take
イテレータが一意の値を生成している間にやりたいこと。だから私はinspect
チェーンを -ing し、ベクトルにプッシュしてからtake_while
スコープでチェックしています:
ただし、Rust コンパイルは次のエラーを吐き出します。
明らかに、「借りる」という概念を理解していません。私は何を間違っていますか?
rust - 借用した値を列挙型に埋め込みますか?
次のコードに問題があります。
(再生リンク)
HelloPhrase
実装する言語、英語、ロシア語などの特性です。Phrases
マネージャー構造体であり、言語からフレーズへの多くのマップを持つことができます。これは不自然な例ですが、これをイベント マネージャー (つまり、X 入力のイベント ハンドラーを取得する)、または HTTP ハンドラーおよびルーターと考えることができます。
そうは言っても、 a の所有権を借りHelloPhrase
て呼び出し元に返す方法を理解するのに苦労しています。実行すると、次のエラーが返されます。
私は追加しようとしました:
と
(再生リンク)
次のエラーが発生します。
列挙型にライフタイムを追加するのに問題があります-理論的には、戻り値のライフタイムを構造体のライフタイムにしたいのですPhrases
が、ライフタイムの構文はこれまでのところ非常に混乱しています。これを 2 つの質問にまとめると、次のようになります。
GetHelloResult
このエラーを満たすために、 にライフタイムを追加するにはどうすればよいですか?- Rust の所有規則に基づいて、Rust でアンチパターンを実行しようとしていますか? このようなものには、どのようなデザインが適しているでしょうか?
ドキュメントに基づいて、構造体でライフタイムを使用する方法は知っていますが、列挙型にライフタイムを追加する方法はわかりません (構文に関して)。構造体の有効期間についてだけ言及したのは、それが欠けている部分だと思うからですが、正直なところわかりません。hello_phrases
さらに、構造体と実装にライフタイムを追加してマップに追加しようとすると、エラーが発生します
rust - 「一度に複数回可変として変数を借りることはできません」というエラーを回避するには、グラフ コードを再構築する方法を教えてください。
正常にコンパイルされる単純なグラフがあります。
しかし、私がそれを使用するとコンパイルに失敗します:
エラー:
同様の質問をすべて見ました。Graph::add_node()
メソッドが を使用しているため、それが失敗していることはわかっています&mut self
。同様のすべての質問で、一般的な答えは「コードを再構築する」です。理解できません どうすればいいですか?このコードを再構築するにはどうすればよいですか?
rust - トラバーサルでの RefCell 借用の循環参照
私はRustを学んでいて、双方向リンクリストをコーディングしてみました。しかし、私はすでに典型的な反復トラバーサルの実装に行き詰まっています。ボロー チェッカー/ドロップ チェッカーが厳しすぎて、ボローが から関数の境界を越えたときに、ボローの正しい有効期間を推測できないという印象を受けていますRefCell
。curr
変数バインディング (この場合) を現在のコンテンツの借用に繰り返し設定する必要があります。
コンパイラは不平を言います:
NLLなし
NLLあり
この問題に対する反復的な解決策(非再帰的)を本当に感謝します。
rust - ループ内のローカルの借用をリセットできますか?
大きなルックアップ テーブルへのポインタを必要とする処理ループがあります。残念なことに、ポインタはソース データから 3 重に間接化されているため、内部ループのためにそのポインタを維持することがパフォーマンスにとって不可欠です。
万一状態を変更する必要がある場合に状態変数を「借用解除」していることを借用チェッカーに伝える方法はありmodify_state
ますか?関数がトリガーされた場合にのみスライスを再検索できますか?
私が考えた 1 つの解決策は、データをスライス参照に変更しmem::replace
、関数の先頭で構造体に対して a を実行し、スライスをローカル スコープにプルしてから、関数の最後で元に戻すことでしたが、これは非常に脆弱です。エラーが発生しやすい(返品のたびにアイテムを交換することを覚えておく必要があるため). これを達成する別の方法はありますか?
rust - 2 つのベクトルをマージしながら照合する場合の「移動された値の使用」
カウントを持つタグのベクトルのマージ関数を作成していますが、借用エラーが発生しています。
エラーが発生します:
同様のエラーがv2
. 通常、問題の場所と問題の原因となった以前の移動が表示されますが、ここには表示されません。
私は多くの順列を試しましたが、次の変更でコンパイルできましたが、すべてのクローン作成とタプルの再作成、およびOption
s の再作成に満足していません。
誰かが借用チェッカーの挑戦を探している場合に備えて、参考までに、私が本当に書きたいことを追加します。
(v1, v2)
各パスが強制的にv1
およびに設定されるように、一致 オン は値を移動する必要があることに注意してくださいv2
。まだ Haskell ほどきれいではありませんが、より近いです。