問題タブ [rust]
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.
optimization - ループを最適化する錆?
C と Rust のパフォーマンスを比較するために、いくつかの非常に単純なベンチマークを行っていました。整数を追加する関数1 + 2 + ... + n
(手動で計算して確認できるもの) を使用しましたn = 10^10
。
Rust のコードは次のようになります。
Cコードは次のとおりです。
私はそれらをコンパイルして実行しました:
次に、C と Rust の両方で最適化フラグをオンにしてみました。
これらの結果は私を驚かせました。最適化にはある程度の効果があると思っていましたが、最適化されたRustバージョンは100000倍高速です:)。
私は変更を試みn
ました (唯一の制限はu64
で、実行時間はまだ実質的にゼロでした)、別の問題 ( 1^5 + 2^5 + 3^5 + ... + n^5
) も試しましたが、同様の結果が得られましrustc -O
た。でコンパイルされた同じアルゴリズムよりも高速ですgcc -O9
。
だから私の質問は:何が起こっているのですか?:) を最適化するコンパイラは理解できましたが、1 + 2 + .. + n = (n*n + n)/2
コンパイラが の式を導出できるとは想像できません1^5 + 2^5 + 3^5 + .. + n^5
。一方、私が見る限り、結果は何らかの方法で計算されたに違いありません (そして、それは正しいようです)。
ああ、そして:
immutability - Rust "エラー: 不変フィールドの外への移動"
次の Rust 構造体を作成しました。
そして、それを印刷する次のコード:
このコードをコンパイルしようとすると、次のエラーが発生します。
これは何を意味するのでしょうか?を含む行は(*hdr).name, (*hdr).data)
、エラーなしでコンパイルされます。match
ステートメントはいかなる方法でも変更しようとすべきではないためhdr.next
、不変性がどのように発生するのかわかりません。ポインタを取らない修正版を書き込もうとしました:
これは私に与えました:
ここで何が起こっているのかを理解するのを手伝ってください!:)
graph - グラフ構造の所有ポインタ
Rust コミュニティの寛大な支援により、マネージ ポインターを使用して組み立てられたトポロジ データ構造のベースを取得することができました。これはかなりうまくまとまり、私は一般的に Rust についてかなり興奮していました。次に、この投稿を読みました(これは合理的な計画のように思えます)。これをきっかけに、可能であれば、所有されているポインターのみを使用して、後戻りして再構築しようとしました。
これは、マネージ ポインターを使用した作業バージョンです。
ライフタイムエラーを数時間追跡した後、周期的な性質のために、所有されているポインターではこれが不可能である可能性があるという結論に達しました (警告されたように結び目を結ぶことなく)。これに対する私の弱い試みは以下のとおりです。私の質問は、マネージ ポインターに頼らずにこの構造を実装することは可能ですか? そうでない場合、上記のコードは合理的に「錆びている」と見なされますか? (慣用的な錆)。ありがとう。
enums - Rust列挙型の型をブール値でチェックしますか?
Rust で作成した単純な関数にコマンドライン引数を渡すようにユーザーに求めています。int::from_str(args[1])
を使用して変換できることはわかっていますがOption<int>
、これは を返します。つまり、以下のように を受け取る関数に渡すには、ステートメントint
を使用する必要があります。match
ただし、引数がn 個の場合、2^ nの可能性があります。何かで一連のネストされたmatch
ステートメントを書くのはひどいことです。次のような方法があれば理想的です。
そのような方法はありますか?これにより、列挙型のどのメンバーが他にあるかをテストできますmatch
か?
typeclass - Rust: 特性/型クラスを使用して一般的な数値関数を実装する
整数のリンクリストを作成する機能があります:
ただし、uint、double などの任意の数値型の範囲を作成したいと考えています。しかし、たとえば、これは機能しません。
これは以下を生成します:
「数値」型で呼び出せるように制限する汎用関数を錆で作成するにはどうすればよいですか? 自分でインターフェイスを具体的に書く必要はありませんか?私は、多くの標準ライブラリの特性 (マニュアルのセクション 6.2.1.1 にリストされているものなどeq
、ord
、 など、しかし今ではそれらが適切な「特性」であるかどうか疑問に思っています)があると想定していました。ジェネリック関数を宣言するときに使用しますか?