問題タブ [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 つのボールが跳ね回る長方形の領域であるフィールドを使用した単純なシミュレーションです。Field
構造体には、各ボールupdate
を呼び出すメソッドがあります。update
彼らの方法では、ボールはupdate
速度に基づいて動き回る必要があります。しかし、フィールドの境界だけでなく、互いに反応する必要もあります。
Ball
境界と他のボールに関する情報を構造体の更新関数に取得するにはどうすればよいですか? の次の行Field::update
はコンパイルされません。
次のエラーが発生します。
私は理解していますが、これを回避する方法がわかりません。
multithreading - ベクトル内の関数のスレッド呼び出し
EventRegistry
イベントリスナーを登録するために使用できる があります。その後、イベントがブロードキャストされると、適切なリスナーが呼び出されます。しかし、マルチスレッド化しようとすると、コンパイルされません。このコードを機能させるにはどうすればよいですか?
Playpen (最小かどうかはわかりませんが、エラーが発生します)
を使用thread::scoped
しても動作しますが、これは不安定で、すぐにメイン スレッドに参加するためだけに動作すると思います。
multithreading - 複製せずにスレッドとデータを共有することは可能ですか?
numbers
作業をスレッドに委譲しているとき、次の例のように、すべてのスレッドよりも長く存続するデータを持っていることがよくあります。
どこも変更されておらず、join
s があるため、スレッドがそれを使用して完了していることが保証されています。ただし、Rust の借用チェッカーは次のことを判断できません。
私がこれまで見てきた解決策はすべて、データの一部を複製すること (またはデータの一部を複製するArc
こと) を伴います。しかし、クローンを作成せずにそれを行うことは可能ですか?
rust - いくつかのデータとデータへの参照を所有する構造体
オブジェクトの構築により、そのオブジェクトの有効期間に必要なデータが割り当てられますが、データへの参照を保持する必要がある別のオブジェクトも作成されます。
これをRustの言葉で表現することは可能ですか?
ここで私は、同じライフタイムを持ち、もちろんコールより長生きしたいと考えObj
ています。AnotherObj
data
new()
rust - パターン マッチを使用して HashMap に追加したい。
ある単語をHashMap
. キーが存在する場合はカウンターを 1 増やし、キーが存在しない場合は値を追加します1
。私は本能的にパターンマッチでこれをやりたいと思っていますが、ボローミュータブルを複数回エラーにしました:
私が得るエラーは次のとおりです。
コンパイラが不機嫌な理由を理解しています: をキーにした値を変更するつもりだと言いましたword
が、挿入はその値にありません。ただし、挿入は にあるNone
ため、コンパイラは現在変更の可能性がないことに気付いたのではないかと考えていましたc[s]
。
この方法は機能するはずですが、トリックがありません。私は何を間違っていますか?
編集:私はこれを使用してこれを行うことができることに気付きました
しかし、これはパターンマッチに対して恐ろしく醜いコードのようです (特にcontains_key()
、if としてチェックを実行する必要があり、次にSome
.
iterator - 別の属性を反復しながら構造体の 1 つの属性を変更する
私は2つの構造体を持っていVec
ます。もう一方を変更しながら、一方を反復できるようにしたい。プログラムの例を次に示します。
しかし、次のコンパイラ エラーがあります。
コンパイラが不平を言っていることを理解しています。self
私はまだそれをループしているので、for ループで借用しました。
概念的には、これを行う方法があるはずです。を変更しているだけs.b
で、ループしているもの ( s.a
) は変更していません。この分離を実証し、この種のプログラムをコンパイルできるようにするプログラムを作成する方法はありますか?
これは大規模なプログラムの単純化された例であるため、一般的な構造を同じに保つ必要があります (1 つが繰り返され、もう 1 つが更新されるいくつかのものを持つ構造体)。
process - 生成された子プロセスとの間で複数回パイプすることはできません
Rust を使用して子シェルを生成し、任意のコマンドを繰り返し渡してその出力を処理できるようにしたいと考えています。単一のコマンドを渡し、その単一の出力を受け取る方法を示す多くの例をオンラインで見つけましたが、繰り返し実行できないようです。
たとえば、次のコードはコメントの後の行でハングします。(read_to_string()
子プロセスからstdoutを受け取るまでブロックしていると思いますが、もしそうなら、なぜその出力が来ないのか理解できません..)
私は Rust の初心者であり、コードからループ命令を削除して参照を構造体のstd::process::Child
内部を不変にする。たとえば、これから:
これに:
明らかに、繰り返し実行するls
ことは私の最終的な目標ではありません。シェル スクリプトを作成して、それを Rust に繰り返し実行させることもできますが、(Rust についてもっと学ぶという目標は別として!)これは私が必要とするものです。少なくとも原則として、より複雑なプロジェクトで実行できるようにする必要があります (それが何らかの解決策に関連していることが判明した場合は喜んで参加しますが、おそらくこの質問の範囲外です!)
最後に、この方法で子シェルを使用できないことが判明した場合でも、他の任意のコマンドを実行している生成されたプロセスとの間で繰り返し/継続的にパイプする方法を学びたいと思います。 Rust のドキュメント、チュートリアル、またはスタック オーバーフローで情報を見つけることができません。