問題タブ [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 - ビルダーパターンを使用すると、「借りた値が十分に長く存続しません」
次のコードがあります。
私はこれを行うことができるようにしたいと思います:
次のエラーが表示されます。
エラー: 借用した値は長生きしません let mut canvas = Canvas::new(100, 100, &renderer)
Canvas
返されたオブジェクトが十分に長く存続しないのはなぜですか? 結果を中間に保存すると、let
機能します。なぜ?
rust - 変更可能な参照とライフタイムの保存
これを機能させるために何時間も無駄な時間を費やしてきましたが、私の唯一の手段はコードを要約して皆さんに助けを求めることです。
状況は、次のコードで の 2 つのインスタンスのコメントを外すと、mut
コンパイルされなくなります (私にとって意味のある理由ではありません)。
mut
代わりにref を格納するときに発生するエラーVec
は次のとおりです。
誰かがなぜこれが起こっているのか説明できれば幸いです。RefCell
直感的には、の借用が範囲外になることは問題ではないように思われます。Vec
参照が指すデータを (したがってもRefCell
) 所有していないのに、なぜコンパイラはそれらの参照の有効期間を気にするのでしょうか?
PS 単純化されたコードの抜粋では、変更可能な参照を a に格納しているVec
理由や、a を使用している理由が明らかにならないことはわかってRefCell
います — ただし、偶然ではないと言えば十分です
index
PPSメソッドやトレイトに関連付けられた型の有効期間の注釈を少しいじってみましたが、これまでのところ、それを行うことでさまざまなエラーが発生するだけでした
rust - メンバー関数から呼び出されたクロージャで自己を変更するにはどうすればよいですか?
正当なチェスの動きを計算しようとしていますが、借用チェッカーを満たすのに問題があります。これらのメソッドを実装する構造体がありChess
ます (重要でないコードは に置き換えられます...
):
まだ借りている間にクロージャー内get_legal_moves
を変更しているため、コンパイルエラーが発生します。self
get_moves
self
解決しようとしている問題を示す簡単な例を作成しました。
エラー:
コードがコンパイルできるように借用チェッカーを満たすにはどうすればよいですか?
rust - これは「Rust way」の借用ですか?
別のアプリケーションを起動しようとすると、その標準入力に何かを書き込んでから、完了するのを待つと、私のコードは次のようになります (old_io):
それは機能していますが、それが進むべき道だとは思いません。「&mut process.stdin.as_mut().unwrap()」は「プロセス」を借用しているように見えるので、再度アクセスする前にスコープ外になることを確認する必要がありますね。もう 1 つの質問は、「プロセス」を借用する必要があるのはなぜですか?"
iterator - Peekable を使用して「慎重な」take_while を実装する
fromのように動作するが、最初に失敗したアイテムを消費しない新しい操作 Peekable
の基礎として使用したいと思います。(これが良いアイデアかどうか、Rust でこの目標を達成するためのより良い方法があるかどうかという副次的な質問があります。その方向のヒントがあれば幸いですが、ほとんどの場合、自分のコードがどこにあるかを理解しようとしています。速報)。cautious_take_while
take_while
IteratorExt
有効にしようとしている API は基本的に次のとおりです。
ここで MCVEを作成してみましたが、次のようになりました。
:10:5: 10:19 エラー: 借用したコンテンツから移動できません:10 chars.by_ref().cautious_take_while(|&x| x != '.');
私が知る限りTakeWhile
、関数シグネチャに関して Rust のものと同じパターンに従っていますが、借用チェッカーとは異なる動作が見られます。誰かが私が間違っていることを指摘できますか?
rust - 親子関係借用チェッカー
コメントでマークされたエラーメッセージを生成する以下のコードがあります。私はメッセージを理解していると思います: 親を 2 回借用したい: 1 回はその子を見つけるため、もう 1 回は子への引数として (エラー内の可変/不変の単語は関係ありません)。Child
を変更しても消えないことを証明する必要がありParent
ます。しかし、これを行う方法がわかりません。縫い目が無駄になる以外は何でもできるRc<Child>
ので、いくつかのライフタイムを追加することでうまくいくことを願っています。
rust - 構造体から列挙型フィールドを取得します: 借用したコンテンツから移動できません
私はRustが初めてで、所有権/借用の概念に頭を悩ませようとしています。これで、コードをコンパイル エラーを発生させる最小限のコード サンプルに減らしました。
私はまだ、すべてが価値観によってコピーされているという考え方にとどまってself.color
いますColor
。どうやら、私は間違っています。SOでこの同じエラーに関する他の質問を見つけましたが、問題の解決策はありません。
私が理解しているように、フィールドは所有者が所有していDisplay
ます。への参照を借りただけなので、Display
所有していません。の所有権を私に譲渡color
しようとしていますが、私は を所有Color
していないため、これは不可能Display
です。これは正しいです?
どうすれば解決できますか?
rust - 既に使用しているのに、コンパイラが「let」バインディングの使用を検討するように指示するのはなぜですか?
私のエラーとその修正方法を教えてください。
(遊び場)
コンパイラのエラーは、「let
バインディングの使用を検討する」ことを示唆していますが、私はすでに次のようになっています。
これは明らかに初心者の質問です。この時点で十分な Rust を作成したので、借用チェッカーを処理できると思っていましたが、そうではないようです。
この質問は「let」バインディングを使用して値の寿命を延ばすに似ていますが、式を複数のステートメントに分割することは含まれていないため、問題は同じではないと思います。
rust - 変数のスコープが定義順序に依存するのはなぜですか?
基本的な (そしておそらくばかげた) 所有権に関する質問があります。内にラップされた&str
from値のベクトルを作成しようとしています。中間変数を使用して抽出/ラップ解除を格納していますが、借用チェッカーを満たすために、ベクトルの前にこの中間変数を定義する必要があるようです:String
Some(String)
String
作業コード:
非動作コード:
そしてコンパイラエラー:
val
問題は、ベクトルの前に変数を定義する必要があるのはなぜv
ですか? 私が見ているように、val
スコープはスコープと同じv
ですか、それとも何か不足していますか?
rust - 借用した参照を明示的に返す match ステートメント
Rust を見ていると、よくわからない動作に気付きました。
私は期待通りに動作するこのコードを持っています:
get_or_create_foo()
借用した文字列スライスを返すように変更すると、コンパイラはコンパイルを拒否します。
コンパイル ログ:
私の理解では、コードは有効です。前述の借用はmatch
、コードの変更につながるパスを使用して制御が句を離れるとすぐに返される可能性がありますv
。
私が間違っている?そのようなコードを許可すると問題が発生する場合、誰かが例を挙げてもらえますか?