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

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

6
Rustで文字列の最初の文字を大文字にするのはなぜそれほど複雑なのですか?
の最初の文字を大文字にしたいのですが&str。それは単純な問題であり、私は単純な解決策を望んでいます。直感は私にこのようなことをするように言います: let mut s = "foobar"; s[0] = s[0].to_uppercase(); ただし&str、このようにsにインデックスを付けることはできません。私がそれを行うことができた唯一の方法は、過度に複雑に思えます。を&strイテレータに変換し、イテレータをベクトルに変換します。ベクトルの最初の項目を大文字にします。これにより、イテレータが作成され、インデックスが作成されますOption。これをアンラップして、大文字の最初の文字を取得します。次に、ベクトルをイテレータに変換しString、それをに変換し、それをに変換します&str。 let s1 = "foobar"; let mut v: Vec<char> = s1.chars().collect(); v[0] = v[0].to_uppercase().nth(0).unwrap(); let s2: String = v.into_iter().collect(); let s3 = &s2; これよりも簡単な方法はありますか?もしそうなら、何ですか?そうでない場合、なぜRustはこのように設計されているのですか? 同様の質問
82 string  rust  uppercase 

1
Rustの「基本タイプ」とは何ですか?
どこかで「基本タイプ」という用語(およびその属性#[fundamental])を見つけましたが、今はもっと詳しく知りたいと思っています。状況によっては、一貫性のルールを緩和することだと漠然と覚えています。そして、参照型はそのような基本的な型だと思います。 残念ながら、ウェブを検索してもそれほど遠くに行けませんでした。Rustのリファレンスでは(私が見る限り)言及されていません。タプルの基本的なタイプの作成と、属性を導入したRFC に関する問題を見つけました。ただし、RFCには基本的なタイプに関する単一の段落があります。 #[fundamental]タイプはFooオーバーブランケットのimplを実装するものですFoo破壊の変化です。説明されているように、&そして&mut基本的なものです。この属性は、に適用されるBox作る、Box など同じように動作&し、&mut一貫性に関して。 表現を理解するのはかなり難しいと思います。基本的なタイプについてこのビットを理解するには、完全なRFCについての深い知識が必要だと感じています。基本的な型をいくらか単純な言葉で説明できることを望んでいました(もちろん、単純化しすぎないでください)この質問は、見つけやすい知識としても役立ちます。 基本的なタイプを理解するために、これらの質問に答えたいと思います(もちろん、「何が偶数か?」という主要な質問に加えて): 基本的なタイプは、非基本的なタイプよりも多くを行うことができますか? 私は、ライブラリの作成者として、自分のタイプの一部にマークを付けることから何らかの方法で利益を得ることができます#[fundamental]か? コア言語または標準ライブラリのどのタイプが基本ですか?
37 rust 

1
コピーでもクローンでもないグローバル定数は、Rustでどのように機能しますか?
次のスニペット(遊び場)があるとしましょう struct A { pub val: u32 } const GLOBAL_A: A = A {val: 2}; fn main() { let some_a: A = GLOBAL_A; let other_a: A = GLOBAL_A; println!("double val = {}", some_a.val + other_a.val); } ももAでもCloneないのでCopy、の値GLOBAL_Aが移動されると思います。これはconstにはあまり意味がなく、示されているように、2回「移動」できるため、とにかくそうなることはありません。 上記のスニペットを考慮動作するようルールはどのようなものAではありませんCloneやCopy?
20 rust  const  move 

1
ネストされた配列インデックスで「変更可能としても借りられるため、不変として借りることができない」とはどういう意味ですか?
この場合のエラーの意味: fn main() { let mut v: Vec<usize> = vec![1, 2, 3, 4, 5]; v[v[1]] = 999; } error[E0502]: cannot borrow `v` as immutable because it is also borrowed as mutable --> src/main.rs:3:7 | 3 | v[v[1]] = 999; | --^---- | | | | | immutable borrow occurs here …

2
`std :: mem :: drop`が上位のトレイト境界のクロージャ| _ |()とまったく同じではないのはなぜですか?
の実装はstd::mem::drop次のように文書化されています。 pub fn drop<T>(_x: T) { } そのため、クロージャー|_| ()(通称、トイレクロージャー)dropは、双方向での1対1の交換の可能性があると予想します。ただし、以下のコードdropは、これが関数のパラメーターにバインドされたより高いランクの特性と互換性がないことを示していますが、トイレのクロージャーは互換性があります。 fn foo<F, T>(f: F, x: T) where for<'a> F: FnOnce(&'a T), { dbg!(f(&x)); } fn main() { foo(|_| (), "toilet closure"); // this compiles foo(drop, "drop"); // this does not! } コンパイラのエラーメッセージ: error[E0631]: type mismatch in function arguments --> src/main.rs:10:5 | …

4
ランク付けされたトレイトバインドされたトレイトから関連付けられたタイプを返すにはどうすればよいですか?
関連する型を逆シリアル化する機能を持つトレイトがあります。ただし、その関連付けられた型には、呼び出し元が決定する存続期間が必要なため、より高いランクの特性を使用する別の特性を持っているため、どの存続期間でも逆シリアル化できます。 この関連する型を返すクロージャーを使用する必要があります。 これを行うには、次のコードがあります。 #![allow(unreachable_code)] use std::marker::PhantomData; trait Endpoint: for<'a> EndpointBody<'a> {} trait EndpointBody<'a> { type Out: 'a; fn serialize(body: &Self::Out) -> Vec<u8>; fn deserialize(raw_body: &'a [u8]) -> Self::Out; } // ///////////////////////////////////////////////////////// /// Trait object compatible handler trait Handler { fn execute(&self, raw_body: &[u8]) -> Vec<u8>; } /// Wraps a function …

1
Rustのマップに非同期関数を挿入するにはどうすればよいですか?
の非同期ルーターを作成するときに、非同期機能を処理できませんhyper。 このコード: use std::collections::HashMap; use std::future::Future; type BoxedResult<T> = Result<T, Box<dyn std::error::Error + Send + Sync>>; type CalcFn = Box<dyn Fn(i32, i32) -> dyn Future<Output = BoxedResult<i32>>>; async fn add(a: i32, b: i32) -> BoxedResult<i32> { Ok(a + b) } async fn sub(a: i32, b: i32) -> BoxedResult<i32> { Ok(a …
11 rust  async-await 

1
パッケージなしでコードのみのデバッグ情報を含めることはできますか?
デバッグ情報が含まれていると、私のバイナリは約400 MBになります。これは、Rustにすべての依存関係のデバッグ情報が含まれているために発生します。私のコードだけにデバッグ情報を含める方法はありますか? [package] name = "app" version = "0.7.1" edition = "2018" [dependencies] actix = "*" actix-web = {version = "1.0", features = ["ssl"]} ... tokio-core = "*" tokio = "*" [profile.release] debug = true
11 rust  rust-cargo 


1
`| _ |の違いは何ですか 非同期移動{} `および`非同期移動| _ | {} `
次の例を考えてみましょう: main.rs use futures::executor::block_on; use futures::future::{FutureExt, TryFutureExt}; async fn fut1() -> Result<String, u32> { Ok("ok".to_string()) } fn main() { println!("Hello, world!"); match block_on(fut1().and_then(|x| async move { Ok(format!("{} is \"ok\"", x)) })) { Ok(s) => println!("{}", s), Err(u) => println!("{}", u) }; } Cargo.toml [dependencies] futures = "^0.3" の|x| async move …
10 rust 

1
参照をコールバックとして受け取るRust async fnの使用方法
async fnはを実装する匿名型を返すFutureため、それをコールバックとして使用する場合は、戻り値を特性オブジェクトに変換する必要があります。 これを行う関数を作成しようとしましたが、いくつかの寿命の問題がありました。 async fnすべてのパラメータの有効期間を返すため、コールバックの署名も必要です。コールバックの戻り値に有効期間を追加するにはどうすればよいですか? use futures::future::{Future, FutureExt, LocalBoxFuture}; type Context = (); type AsyncCb = Box<dyn for<'r> FnOnce(&'r Context) -> LocalBoxFuture<'r, ()>>; fn normalize_async_cb<Fut: Future<Output = ()>>(f: for<'r> fn(&'r Context) -> Fut) -> AsyncCb // how to add 'r for Fut? ^^^ { let cb = move |ctx: &Context| …
10 rust  async-await 

1
2番目のimplを追加すると、なぜ引数のderef強制が妨げられるのですか?
impl Add<char> for Stringを標準ライブラリに追加しようとしたときにこの問題に遭遇しました。しかし、オペレーターのシェニガンがなくても、簡単に複製できます。私たちはこれから始めます: trait MyAdd<Rhs> { fn add(self, rhs: Rhs) -> Self; } impl MyAdd<&str> for String { fn add(mut self, rhs: &str) -> Self { self.push_str(rhs); self } } 十分に単純です。これにより、次のコードがコンパイルされます。 let a = String::from("a"); let b = String::from("b"); MyAdd::add(a, &b); この場合、2番目の引数式(&b)のタイプはであることに注意してください&String。次に、それがderef-coercedされ&str、関数呼び出しが機能します。 ただし、次の実装を追加してみましょう。 impl MyAdd<char> for String { fn …

1
ディーゼルを同期アクター、actix_web :: web :: blockまたはfutures-cpupoolを使用して実行する必要がありますか?
バックグラウンド 私はr2d2を通じてディーゼルを使用して、actix-webアプリケーションに取り組んでおり、非同期クエリを最適に作成する方法がわかりません。妥当と思われる3つのオプションを見つけましたが、どちらが最適かわかりません。 可能なソリューション 俳優の同期 一例として、actixの例を使用することができますが、それは非常に複雑であり、構築するにはかなりの量のボイラープレートが必要です。より合理的な解決策が存在することを願っています。 Actix_web::web::block 別のオプションとしてactix_web::web::block、クエリ関数を将来にラップするためにを使用することもできますが、これがパフォーマンスに与える影響はわかりません。 クエリは同じTokioシステムで実行されていますか?ソースで見つけたものから、それは基礎となるactix-web threadpoolにスレッドを作成します。問題ありますか? コードを正しく読んだ場合、r2d2は接続を取得するときにそのスレッドをブロックします。これにより、コアのactix-webプールの一部がブロックされます。データベースクエリと同じです。これにより、そのプールにスレッドがあるよりも多くのクエリを実行した場合、すべてのactix-webがブロックされますか?もしそうなら、大きな問題。 先物-cpupool 最後に、不要なオーバーヘッドが生じる可能性のある安全な賭けは、futures-cpupoolです。主な問題は、これが私のプロジェクトに別のクレートを追加することを意味することですが、アプリケーション内で不必要に複数のcpu-poolが浮かんでいるという考えは好きではありません。 r2d2とディーゼルの両方がブロックするので、ここには驚くほど多くのトリッキーなことが存在します。 最も重要なのは、このcpupoolを同じr2d2プールを使用していないものと共有しないことです(作成されたすべてのスレッドは、r2d2接続の待機をブロックし、作業が存在する場合はプール全体をロックダウンする可能性があるため)。 2番目に(少し明らかに)、プール内のスレッドよりも多くのr2d2接続を使用しないでください。逆に、大きい接続はリソースを無駄にするため(接続が未使用/スレッドが常にブロックされているため)(おそらくもう1つのスレッド、おそらくより速く) cpupoolスケジューラーではなくOSスケジューラーによる接続のハンドオーバー)。 最後に、使用しているデータベースとそこにあるパフォーマンスに注意してください。単一の接続r2d2とプール内の単一のスレッドを実行することは、書き込みの多いsqliteアプリケーションで最適な場合があります(そのような場合は適切なデータベースをお勧めします)。 古い答え 機能する可能性のある古いソリューション https://www.reddit.com/r/rust/comments/axy0hp/patterns_to_scale_actixweb_and_diesel/ 本質的に、Futures-cpupoolを推奨します。 将来のrsでブロッキングI / Oをカプセル化するための最良のアプローチは何ですか? 一般的な場合はFutures-cpupoolをお勧めします。 機能しない古いソリューション https://www.reddit.com/r/rust/comments/9fe1ye/noob_here_can_we_talk_about_async_and_databases/ 古いactix-webバージョンの本当に素晴らしい修正。私が見つけることができるものから、リクエストにはもはやCPUプールがありません。

1
Rustの「クレート機能」を有効にするにはどうすればよいですか?
使用しようとしていますrand::SmallRng。ドキュメントは言う このPRNGは機能依存型ですsmall_rng。使用するには、クレート機能を有効にする必要があります。 検索してみましたが、「クレート機能」を有効にする方法がわかりません。このフレーズは、Rustのドキュメントではどこにも使用されていません。これは私が思いつくことができる最高のものです: [features] default = ["small_rng"] しかし、私は得ます: 機能にdefaultはsmall_rng、依存関係でも別の機能でもないものが含まれます ドキュメントが間違っていますか、それとも私が見逃しているものがありますか?

2
無効なポインターを生成する関数参照をキャストしますか?
私はサードパーティのコードのエラーを追跡しており、それを何かに沿って絞り込みました。 use libc::c_void; pub unsafe fn foo() {} fn main() { let ptr = &foo as *const _ as *const c_void; println!("{:x}", ptr as usize); } 安定した1.38.0で実行すると、関数ポインタが出力されますが、ベータ版(1.39.0-beta.6)で毎晩「1」を返します。(遊び場) _推論されているものは何ですか?なぜ動作が変更されましたか? これをキャストする正しい方法は単にであるとfoo as *const c_void思いますが、これは私のコードではありません。

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