タグ付けされた質問 「rust」

Rustは、安全性、速度、同時実行性の3つの目標に焦点を当てたガベージコレクターのないシステムプログラミング言語です。Rustで記述されたコードに関する質問には、このタグを使用します。[rust-2018]など、特定のエディションを必要とするコードを参照する質問には、エディション固有のタグを使用します。[rust-cargo]や[rust-macros]などのサブトピックには、より具体的なタグを使用してください。

1
std :: ptr :: writeは、書き込むバイトの「初期化されていない状態」を転送しますか?
FFIの境界を越えてポインターサイズのintに収まるトランザクション型を支援するライブラリを開発しています。次のような構造体があるとします。 use std::mem::{size_of, align_of}; struct PaddingDemo { data: u8, force_pad: [usize; 0] } assert_eq!(size_of::<PaddingDemo>(), size_of::<usize>()); assert_eq!(align_of::<PaddingDemo>(), align_of::<usize>()); この構造体には、1データバイトと7パディングバイトがあります。この構造体のインスタンスをaにパックしusize、FFI境界の反対側でアンパックします。このライブラリーは汎用なので、私はMaybeUninitand を使用していptr::writeます: use std::ptr; use std::mem::MaybeUninit; let data = PaddingDemo { data: 12, force_pad: [] }; // In order to ensure all the bytes are initialized, // zero-initialize the buffer let mut packed: …

2
Rustが誤った戻り型のコードを許可するのはなぜですか?
次のRustコードを考えます。 fn f() -> i32 { loop { println!("Infinite loop!"); } println!("Unreachable"); } 戻り値の型が間違っているにもかかわらず、これは(警告付きで)コンパイルされて実行されます。コンパイラーは()、このコードに到達できないことを検出するため、最終行の戻り値のタイプがOKであるように見えます。 ただし、最後のセミコロンを削除すると、次のようになります。 fn f() -> i32 { loop { println!("Infinite loop!"); } println!("Unreachable") } その後、コードはコンパイルされなくなり、型エラーが発生します。 error[E0308]: mismatched types --> src/main.rs:14:5 | 14 | println!("Unreachable") | ^^^^^^^^^^^^^^^^^^^^^^^ expected `i32`, found `()` | = note: this error originates in …

1
忘れてメモリリークを使用する代わりに、Rustを使用してWebAssemblyでクロージャを処理するより良い方法は何ですか?
Closuresを使用してJavaScriptにコールバックを提供するとき、それらを解放しないように対処するためのより良い方法は何ですか?wasm-bindgenガイドを使用して示唆し.forget、それは本質的にメモリをリークしていることを認めています。 通常は、後で適切なタイミングでドロップされるようにハンドルを格納しますが、今のところ、それをグローバルハンドラーにして、forgetメソッドを使用して、クロージャーを無効にすることなくそれをドロップします。これはRustでメモリリークを起こしているので注意してください。 これは、ドロップするのが適切になるまでクロージャーを保管することを示します。でalexcrichtonの答えに、前の質問に、彼は言及します... [...]一度しか呼び出されない場合は、[ Rc/] RefCellを使用しClosureて、クロージャー自体の内部をドロップできます(内部の可変性シェナンを使用します)。 しかし、彼はこの方法の例を提供していません。 閉鎖のマニュアルには、参照を解放するときに処理させるためにはJavaScriptコンテキストに閉鎖への参照を返す例を示します。 cbここにドロップすると、間隔が経過するたびに例外が発生します。代わりに、私たちは、返し JSが間隔をキャンセルし、閉鎖を解放する際に決めることができるように私たちのハンドルバックはJSに。 また#[wasm_bindgen]、この問題を回避するために、パブリック関数のライフタイムやマクロなどの機能を使用する方法もあると思いますが、その方法を理解するのに苦労しています。 私の質問は、.forgetRustからJavaScriptに返されるクロージャーを使用する代わりの選択肢は何ですか?また、使用中の各オプションの簡単な例をいくつか見ていただけますか?

2
手続き型マクロによって生成されたコードで衛生的な識別子を作成するにはどうすればよいですか?
宣言型(macro_rules!)マクロを記述すると、マクロの衛生状態が自動的に取得されます。この例でfは、マクロで名前が付けられた変数を宣言しf、ローカル変数になる識別子を渡します。 macro_rules! decl_example { ($tname:ident, $mname:ident, ($($fstr:tt),*)) => { impl std::fmt::Display for $tname { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { let Self { $mname } = self; write!(f, $($fstr),*) } } } } struct Foo { f: String, } decl_example!(Foo, f, ("I am a Foo: {}", f)); fn …

2
Rustでテール再帰はいつ保証されますか?
C言語 Cプログラミング言語では、末尾再帰を行うのは簡単です。 int foo(...) { return foo(...); } 再帰呼び出しの戻り値と同じように戻ります。この再帰が1000回または100万回繰り返される場合は特に重要です。スタックで大量のメモリを使用します。 さび これで、100万回再帰的に呼び出されるRust関数があります。 fn read_all(input: &mut dyn std::io::Read) -> std::io::Result<()> { match input.read(&mut [0u8]) { Ok ( 0) => Ok(()), Ok ( _) => read_all(input), Err(err) => Err(err), } } (これは最小限の例であり、実際の例はより複雑ですが、主なアイデアを捉えています) ここでは、再帰呼び出しの戻り値がそのまま返されますが、次のようになります。 Rustコンパイラが末尾再帰を適用することを保証しますか? たとえば、のように破棄する必要がある変数を宣言した場合、std::Vecそれは再帰呼び出しの直前(末尾再帰を可能にする)または再帰呼び出しが戻った後(末尾再帰を禁止する)に破棄されますか?

2
VecがIteratorトレイトを実装しないのはなぜですか?
トレイトをVec実装しない理由は何Iteratorですか?iter()すべてのベクトルとスライスを常に呼び出す必要があるため、コードの行が長くなります。 例: let rx = xs.iter().zip(ys.iter()); Scalaと比較して: val rx = xs.zip(ys)
8 rust 

2
すべての列挙型バリアントがコンパイル時に特定の関数から返されるようにする方法は?
私は列挙型を持っています: enum Operation { Add, Subtract, } impl Operation { fn from(s: &str) -> Result<Self, &str> { match s { "+" => Ok(Self::Add), "-" => Ok(Self::Subtract), _ => Err("Invalid operation"), } } } コンパイル時に、列挙型のすべてのバリアントがfrom関数内で処理されるようにしたいと思います。 なぜこれが必要なのですか?たとえば、Product操作を追加して、from関数でこのケースを処理するのを忘れる場合があります。 enum Operation { // ... Product, } impl Operation { fn from(s: &str) -> Result<Self, …
8 enums  rust 

1
Rust 1.38.0にアップデートした後、Vec :: retainの実行が遅くなるのはなぜですか?
Rustを1.36.0からバージョン1.38.0に更新した後、プログラムの実行速度が約50%遅くなっていることに気付きました。 を使用してperf、プログラム時間の半分がalloc::vec::Vec<T>::retain新しいバージョンで費やされていることを発見しました。古いバージョンでは、この機能は表示されません。retain1.38.0ではなぜそんなに長くかかるのでしょうか? への呼び出しretainは次のように行われます: some_vec.retain(|&x| x < DEADLINE); deadlineは定数u32でsome_vecあり、Vec<u32>です。 retainどちらのバージョンでも、呼び出しなしでプログラムを実行しました。この場合、1.38.0は平均してまだ遅いですが、以前に見られた50%を超えるのではなく、最大10%だけ遅くなりました。 テストで何が起こったかを要約するには: バージョン1.36.0 with retain:〜18秒 なしretain:〜11秒 バージョン1.38.0 ありretain:〜28秒 なしretain:〜12秒 再現可能な例として、以下を試すことができます。 use std::time::Instant; fn main() { let start = Instant::now(); let mut my_vec: Vec<u32>; for _ in 0..100_000 { my_vec = (0..10_000).collect(); my_vec.retain(|&x| x < 9000); my_vec.retain(|&x| x < 8000); my_vec.retain(|&x| x < …

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.