公式
https://www.rust-lang.org/
https://blog.rust-lang.org/
https://github.com/rust-lang/rust
Web上の実行環境
https://play.rust-lang.org
日本語の情報
https://rust-jp.rs/
※Rustを学びたい人はまず最初に公式のThe Bookを読むこと
https://doc.rust-lang.org/book/
※Rustを学ぶ際に犯しがちな12の過ち
https://dystroy.org/blog/how-not-to-learn-rust
※Rustのasyncについて知りたければ「async-book」は必読
https://rust-lang.github.io/async-book/
※C++との比較は専用スレへ
C++ vs Rust
https://mevius.5ch.net/test/read.cgi/tech/1619219089/
※次スレは原則>>980が立てること
前スレ
Rust part14
https://mevius.5ch.net/test/read.cgi/tech/1644596656/
Rust part15
■ このスレッドは過去ログ倉庫に格納されています
2022/05/12(木) 18:28:20.99ID:cuIcFT6k
359デフォルトの名無しさん
2022/05/27(金) 10:47:17.91ID:KGTH7nqA360デフォルトの名無しさん
2022/05/27(金) 23:42:23.72ID:QNNDwom0 traitでasync fnなメソッドを宣言してはいけない理由を教えてください
361デフォルトの名無しさん
2022/05/28(土) 00:48:37.27ID:1czNjiXi362デフォルトの名無しさん
2022/05/28(土) 18:21:29.07ID:DPDd3/od async fnはsyntax sugarだから例えば以下は同じ
async fn delayed_add(a: i32, b: i32) -> i32 {
sleep(Duration::from_secs(5)).await;
a + b
}
fn delayed_add(a: i32, b: i32) -> impl Future<Output = i32> {
async move {
sleep(Duration::from_secs(5)).await;
a + b
}
}
つまり現在のRustコンパイラではまだimpl Traitを使える場所が限定されているというもっと大きな問題のために今は使えない
GATsなど現在進行中の諸問題が解決すればいずれ使えるようになるはず
async fn delayed_add(a: i32, b: i32) -> i32 {
sleep(Duration::from_secs(5)).await;
a + b
}
fn delayed_add(a: i32, b: i32) -> impl Future<Output = i32> {
async move {
sleep(Duration::from_secs(5)).await;
a + b
}
}
つまり現在のRustコンパイラではまだimpl Traitを使える場所が限定されているというもっと大きな問題のために今は使えない
GATsなど現在進行中の諸問題が解決すればいずれ使えるようになるはず
363デフォルトの名無しさん
2022/05/28(土) 18:34:44.90ID:DPDd3/od 現状の対策方法としてはimpl FutureをdynにしてBox::pinして返す
trait Foo {
fn delayed_add(a: i32, b: i32) -> Pin<Box<dyn Future<Output = i32>>>;
}
impl Foo for () {
fn delayed_add(a: i32, b: i32) -> Pin<Box<dyn Future<Output = i32>>> {
Box::pin(async move {
sleep(Duration::from_secs(5)).await;
a + b
})
}
}
fn main() {
block_on(async {
let x = <() as Foo>::delayed_add(1, 2).await;
println!("x = {x}");
});
}
これでtraitにて非同期関数を使える
trait Foo {
fn delayed_add(a: i32, b: i32) -> Pin<Box<dyn Future<Output = i32>>>;
}
impl Foo for () {
fn delayed_add(a: i32, b: i32) -> Pin<Box<dyn Future<Output = i32>>> {
Box::pin(async move {
sleep(Duration::from_secs(5)).await;
a + b
})
}
}
fn main() {
block_on(async {
let x = <() as Foo>::delayed_add(1, 2).await;
println!("x = {x}");
});
}
これでtraitにて非同期関数を使える
364デフォルトの名無しさん
2022/05/28(土) 18:41:39.92ID:DPDd3/od それを手動で変換するのは面倒かつコードも見にくいので自動変換してくれる#[async_trait]を使えばasync fnと書ける
use async_trait::async_trait;
#[async_trait]
trait Foo {
async fn delayed_add(a: i32, b: i32) -> i32;
}
#[async_trait]
impl Foo for () {
async fn delayed_add(a: i32, b: i32) -> i32 {
sleep(Duration::from_secs(5)).await;
a + b
}
}
use async_trait::async_trait;
#[async_trait]
trait Foo {
async fn delayed_add(a: i32, b: i32) -> i32;
}
#[async_trait]
impl Foo for () {
async fn delayed_add(a: i32, b: i32) -> i32 {
sleep(Duration::from_secs(5)).await;
a + b
}
}
365デフォルトの名無しさん
2022/05/28(土) 19:10:23.06ID:Hw+E7BcY おじさん調査お疲れ様でした。
366デフォルトの名無しさん
2022/05/28(土) 19:23:54.07ID:6Sv+ENTH ・塩野義製薬が週休3日制導入へ 来年4月、副業も解禁
・塩野義製薬が「週休3日」選択可能に 給与は『週休2日の8割』副業や学び直しを支援
・【フォーカス】サタケ/週休3日制 通年導入めざし夏季のみ試行中 交代制で水曜を休日に
・旅館なのに週休3日!?陣屋・若女将の常識を覆した組織改革
・“時代錯誤”から残業ゼロ、週休3日に! 鳥取の不動産会社が
レガシー企業からDX先進企業になれたワケ
・ネクスウェイ、週休4日制・1日3時間勤務選択できる勤務体系を導入
・日本初「週休4日制度」で、優秀な人材を採用するしくみとは? ?
ナレッジソサエティ久田社長に聞いてみた
・塩野義製薬が「週休3日」選択可能に 給与は『週休2日の8割』副業や学び直しを支援
・【フォーカス】サタケ/週休3日制 通年導入めざし夏季のみ試行中 交代制で水曜を休日に
・旅館なのに週休3日!?陣屋・若女将の常識を覆した組織改革
・“時代錯誤”から残業ゼロ、週休3日に! 鳥取の不動産会社が
レガシー企業からDX先進企業になれたワケ
・ネクスウェイ、週休4日制・1日3時間勤務選択できる勤務体系を導入
・日本初「週休4日制度」で、優秀な人材を採用するしくみとは? ?
ナレッジソサエティ久田社長に聞いてみた
367デフォルトの名無しさん
2022/05/28(土) 20:19:11.57ID:NcTZ/5Yj もう借りまっか
368デフォルトの名無しさん
2022/05/28(土) 21:23:09.11ID:sd5VBl3q ジェネレーターはいつstableになりますか
369デフォルトの名無しさん
2022/05/28(土) 23:09:24.03ID:Gdd1cvMp stableを期待しているということは現状の仕様で納得なんだろうけど
resumeの仕方とか値の受け取り方とか軽快じゃなくね?
let mut generator = || {
yield 1;
yield 2;
yield 3;
return "end"
};
assert_eq!(GeneratorState::Yielded(1), Pin::new(&mut generator).resume(()));
assert_eq!(GeneratorState::Yielded(2), Pin::new(&mut generator).resume(()));
assert_eq!(GeneratorState::Yielded(3), Pin::new(&mut generator).resume(()));
assert_eq!(GeneratorState::Complete("end"), Pin::new(&mut generator).resume(()));
例えばresume構文を用意して記述を見やすくするとか
return値は廃止してOption<T>で返しreturn;でNoneにするとか
resumeの仕方とか値の受け取り方とか軽快じゃなくね?
let mut generator = || {
yield 1;
yield 2;
yield 3;
return "end"
};
assert_eq!(GeneratorState::Yielded(1), Pin::new(&mut generator).resume(()));
assert_eq!(GeneratorState::Yielded(2), Pin::new(&mut generator).resume(()));
assert_eq!(GeneratorState::Yielded(3), Pin::new(&mut generator).resume(()));
assert_eq!(GeneratorState::Complete("end"), Pin::new(&mut generator).resume(()));
例えばresume構文を用意して記述を見やすくするとか
return値は廃止してOption<T>で返しreturn;でNoneにするとか
370デフォルトの名無しさん
2022/05/28(土) 23:30:01.77ID:sd5VBl3q 個人的にはIteratorがyield使って実装できるようになれば満足なのでGeneratorそのものの型とかはそんなに気にしてなかった
371デフォルトの名無しさん
2022/05/28(土) 23:58:46.72ID:Gdd1cvMp372デフォルトの名無しさん
2022/05/29(日) 01:25:03.17ID:B9rZUQzM またイテレータの話してる……
373デフォルトの名無しさん
2022/05/29(日) 01:35:28.37ID:crc4m1b3 結局イテレータを作るには構造体か何かを用意してnext()実装するしかないぜ
それが面倒ならfrom_fnやunfoldなどの汎用イテレータ作成関数を使うしかないな
こんな感じか
fn iter_from_generator<G: Generator + Unpin>(mut generator: G) -> impl Iterator<Item = G::Yield> {
iter::from_fn(move || {
match Pin::new(&mut generator).resume(()) {
GeneratorState::Yielded(n) => Some(n),
_ => None,
}
})
}
fn main() {
let one_two_three = || {
yield 1;
yield 2;
yield 3;
};
for n in iter_from_generator(one_two_three) {
println!("{n}");
}
}
それが面倒ならfrom_fnやunfoldなどの汎用イテレータ作成関数を使うしかないな
こんな感じか
fn iter_from_generator<G: Generator + Unpin>(mut generator: G) -> impl Iterator<Item = G::Yield> {
iter::from_fn(move || {
match Pin::new(&mut generator).resume(()) {
GeneratorState::Yielded(n) => Some(n),
_ => None,
}
})
}
fn main() {
let one_two_three = || {
yield 1;
yield 2;
yield 3;
};
for n in iter_from_generator(one_two_three) {
println!("{n}");
}
}
374デフォルトの名無しさん
2022/05/29(日) 10:29:01.34ID:8RN2vwsK 複クンなんですぐここに貼り付けてしまうん?
それお母さんに見てもらうだけでは不満なん?
それお母さんに見てもらうだけでは不満なん?
375デフォルトの名無しさん
2022/05/29(日) 16:18:25.46ID:G8u1ZvmQ すまんが、関数とジェネリックについてわかんないんだけどさ
https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=c548f2825b9f164eeabdd479c4950484
これってなんで動かないん?
https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=c548f2825b9f164eeabdd479c4950484
これってなんで動かないん?
376デフォルトの名無しさん
2022/05/29(日) 16:49:19.09ID:B9rZUQzM377デフォルトの名無しさん
2022/05/29(日) 16:52:27.60ID:oSeq4vhZ378デフォルトの名無しさん
2022/05/29(日) 17:03:06.39ID:G8u1ZvmQ そういうことなのか!ありがとう!
だからサンプルコードみんなTを引数で受け取って戻値Tを返してるのばっかなのか
だからサンプルコードみんなTを引数で受け取って戻値Tを返してるのばっかなのか
379デフォルトの名無しさん
2022/05/29(日) 17:10:58.33ID:+aZOCBrD 「(i64 の) 1 から変換可能な型」という制約を付けるのであればたとえばこんな感じかな。
https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=73e1d04ceeb2c0aff1dae461126dfb6e
https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=73e1d04ceeb2c0aff1dae461126dfb6e
380デフォルトの名無しさん
2022/05/29(日) 18:07:23.25ID:RPMq4FMA >>378
Tを引数に取らずにTを返すことも一般的に可能
その場合もTに何らかのトレイト境界を付けてそのトレイトのメソッドを呼ぶ形で実現する
fn c<T>() -> T {
T { b: 1 }
}
↓修整
fn c<T: Trait1>() -> T {
T::method1()
}
自分を返すmethod1()を持つトレイトTrait1を宣言しておく
trait Trait1 {
fn method1() -> Self;
}
そして型Aに対してそのトレイトを実装すれば動く
impl Trait1 for A {
fn method1() -> Self {
Self { b: 1 }
}
}
もちろんmethod1を引数付きのメソッドにしてもOK
Tを引数に取らずにTを返すことも一般的に可能
その場合もTに何らかのトレイト境界を付けてそのトレイトのメソッドを呼ぶ形で実現する
fn c<T>() -> T {
T { b: 1 }
}
↓修整
fn c<T: Trait1>() -> T {
T::method1()
}
自分を返すmethod1()を持つトレイトTrait1を宣言しておく
trait Trait1 {
fn method1() -> Self;
}
そして型Aに対してそのトレイトを実装すれば動く
impl Trait1 for A {
fn method1() -> Self {
Self { b: 1 }
}
}
もちろんmethod1を引数付きのメソッドにしてもOK
381デフォルトの名無しさん
2022/05/29(日) 18:42:28.03ID:bkDUG0E+382デフォルトの名無しさん
2022/05/29(日) 19:12:40.72ID:X/raLWS5 >>381
Tに依存する箇所のコンパイルを保留してから、実際にT=Aとしてみてインスタンス生成するからね。
https://wandbox.org/permlink/zOH2lP3k2MEPYwsp
conceptで制限はかけられるけど本質は変わらん
https://wandbox.org/permlink/CdKBg61cUgFy2tBs
Tに依存する箇所のコンパイルを保留してから、実際にT=Aとしてみてインスタンス生成するからね。
https://wandbox.org/permlink/zOH2lP3k2MEPYwsp
conceptで制限はかけられるけど本質は変わらん
https://wandbox.org/permlink/CdKBg61cUgFy2tBs
383デフォルトの名無しさん
2022/05/29(日) 19:30:37.85ID:a9qKdJW4 なんだじゃあRustダメじゃん。
384デフォルトの名無しさん
2022/05/29(日) 20:03:03.02ID:vh1lNXiO そうだよ
ダメだからお前はRust使わないほうがいいよ
ダメだからお前はRust使わないほうがいいよ
385デフォルトの名無しさん
2022/05/29(日) 20:16:50.49ID:JtP99XwD386デフォルトの名無しさん
2022/05/29(日) 20:38:31.90ID:ckaCEYgU 未定義動作ではない。
387デフォルトの名無しさん
2022/05/29(日) 20:38:35.33ID:4wBUBbtY 単一の機関が作ってるなら未定義動作なんて生じないんだけどなw
388デフォルトの名無しさん
2022/05/29(日) 20:50:06.03ID:JtP99XwD C++では未初期化部分がある時
そこを利用した全体が未定義動作となる
そこを利用した全体が未定義動作となる
389デフォルトの名無しさん
2022/05/29(日) 21:08:46.86ID:9wc9mAAQ390デフォルトの名無しさん
2022/05/29(日) 21:14:08.45ID:oq8K5mm2 未初期化領域があっても未初期化領域を読み出さなければ未定義動作にはならない
なので後からでも読み出す前にデータを書き込めば合法
なので後からでも読み出す前にデータを書き込めば合法
391デフォルトの名無しさん
2022/05/29(日) 21:23:18.26ID:B9rZUQzM そもそも初期化されます
https://ja.cppreference.com/w/cpp/language/aggregate_initialization
struct A { int x; int y; int z; };
A a{.y = 2, .x = 1}; // エラー、指示子の順序が宣言の順序と一致しません。
A b{.x = 1, .z = 2}; // OK、 b.y は 0 に初期化されます。
https://ja.cppreference.com/w/cpp/language/aggregate_initialization
struct A { int x; int y; int z; };
A a{.y = 2, .x = 1}; // エラー、指示子の順序が宣言の順序と一致しません。
A b{.x = 1, .z = 2}; // OK、 b.y は 0 に初期化されます。
392デフォルトの名無しさん
2022/05/29(日) 23:05:13.03ID:a9qKdJW4 >>385
嘘つき。
嘘つき。
393デフォルトの名無しさん
2022/05/29(日) 23:38:42.10ID:SnN+FeMM Rustのジェネリクスは
型Tに対してトレイト境界を増やせば増やすほど型Tを使って様々なことができるようになっていく
今回のように型Tに対してトレイト境界が何も無ければ任意の型に適用できる代わりにできることが非常に少ない
例えばC++とは異なりRustではデフォルト値で初期化することすら指定なしにはできない
Defaultトレイトをトレイト境界に持ち、さらにそのメソッドを用いてT::default()することで、
初めてようやくデフォルト値で初期化されたT型を得ることができる
これにより「ある型にとってデフォルト値とは何か」「そもそもその型にデフォルト値はあるのか」「デフォルト値が使われるのはいつか」
といった諸問題を全て解決している
C++の複雑なルールと異なりRustでは非常に簡単でわかりやすくなっている
型Tに対してトレイト境界を増やせば増やすほど型Tを使って様々なことができるようになっていく
今回のように型Tに対してトレイト境界が何も無ければ任意の型に適用できる代わりにできることが非常に少ない
例えばC++とは異なりRustではデフォルト値で初期化することすら指定なしにはできない
Defaultトレイトをトレイト境界に持ち、さらにそのメソッドを用いてT::default()することで、
初めてようやくデフォルト値で初期化されたT型を得ることができる
これにより「ある型にとってデフォルト値とは何か」「そもそもその型にデフォルト値はあるのか」「デフォルト値が使われるのはいつか」
といった諸問題を全て解決している
C++の複雑なルールと異なりRustでは非常に簡単でわかりやすくなっている
394デフォルトの名無しさん
2022/05/30(月) 00:14:44.37ID:S6YD6bxt 一方C++erはデフォルトコンストラクタを使ってデフォルト値を定義した
395デフォルトの名無しさん
2022/05/30(月) 00:34:37.40ID:Wa35ZTPi 長いからデフコンって略したほうが良くないっすか?
396デフォルトの名無しさん
2022/05/30(月) 00:37:19.04ID:QyLPQBc1 全てを明瞭シンプルにしたことがRustの勝因
397デフォルトの名無しさん
2022/05/30(月) 00:39:32.57ID:Wa35ZTPi なんだじゃあJavaと一緒じゃん。
398デフォルトの名無しさん
2022/05/30(月) 00:45:18.57ID:L0CO9j2x 明示的に指示されないメンバも初期化されることに気づけなかったのはC++の仕様が複雑すぎるため
僕が悪いのではないことは明らか
僕が悪いのではないことは明らか
399デフォルトの名無しさん
2022/05/30(月) 02:47:26.12ID:ccLFuKy8 Rustは綺麗に整理されてるいるから複雑な個別ルールを覚えなくて済むね
400デフォルトの名無しさん
2022/05/30(月) 08:58:04.28ID:Pjv5EPMb トレイトを増やしすぎて普段は必要ない補完候補が気持ち悪いぐらい出てくる破綻言語
401デフォルトの名無しさん
2022/05/30(月) 09:26:55.13ID:PFXjMGN7 C#は良い言語ですよ
402デフォルトの名無しさん
2022/05/30(月) 18:11:00.15ID:ByAGrxv3 >>400
ほんこれ
ほんこれ
403デフォルトの名無しさん
2022/05/30(月) 18:37:20.51ID:9QWL5Xmb そんなに補完優秀だったっけ?
rust-analyzer?
rust-analyzer?
404デフォルトの名無しさん
2022/05/30(月) 18:49:27.08ID:FmNIm4Mv RustはDと同じ臭いがする
405デフォルトの名無しさん
2022/05/30(月) 18:56:01.15ID:z2BzOSMS 言ってることはHaskellと同じだと思います!
・コンパイルを通ればバグがないことが保証される。
・静的に解決するのでCの10倍速い。
・C++は遅い。
・C++は危険。
・コンパイルを通ればバグがないことが保証される。
・静的に解決するのでCの10倍速い。
・C++は遅い。
・C++は危険。
406デフォルトの名無しさん
2022/05/30(月) 19:18:53.99ID:ccLFuKy8407デフォルトの名無しさん
2022/05/30(月) 19:34:52.16ID:NdgJBZsO408デフォルトの名無しさん
2022/05/30(月) 20:00:34.27ID:z2BzOSMS Rust屋さんはCを目の敵にしてるから。
409デフォルトの名無しさん
2022/05/30(月) 20:01:09.26ID:+MhjIs8x Rust批判はこのスレでどうぞ
410デフォルトの名無しさん
2022/05/30(月) 20:02:56.21ID:z2BzOSMS Ruby批判もこのスレで良いですか?
411デフォルトの名無しさん
2022/05/30(月) 22:52:59.67ID:vE8PcjqL >>405
haskellでそんなこと聞いたこと無いが。
haskellでそんなこと聞いたこと無いが。
412デフォルトの名無しさん
2022/05/30(月) 23:31:08.66ID:HNl+yJ2Z >>410
それはダメ
それはダメ
413デフォルトの名無しさん
2022/05/30(月) 23:38:49.33ID:cFpihliW >>369
Pinは1回だけでいい
そしてas_mutしてresumeする
let mut g = Pin::new(&mut generator);
assert_eq!(GeneratorState::Yielded(1), g.as_mut().resume(()));
assert_eq!(GeneratorState::Yielded(2), g.as_mut().resume(()));
assert_eq!(GeneratorState::Yielded(3), g.as_mut().resume(()));
assert_eq!(GeneratorState::Complete("end"), g.as_mut().resume(()));
Pinは1回だけでいい
そしてas_mutしてresumeする
let mut g = Pin::new(&mut generator);
assert_eq!(GeneratorState::Yielded(1), g.as_mut().resume(()));
assert_eq!(GeneratorState::Yielded(2), g.as_mut().resume(()));
assert_eq!(GeneratorState::Yielded(3), g.as_mut().resume(()));
assert_eq!(GeneratorState::Complete("end"), g.as_mut().resume(()));
414デフォルトの名無しさん
2022/05/31(火) 00:29:14.66ID:qkI00F5r CLI向けのコマンドラインオプションと設定ファイルと環境変数統一的に扱えるライブラリとかない?
コマンドラインで指定があればそれを、なければ環境変数を、それもなければ設定ファイルを、どれもなければデフォルト値を読む
っていう動作を各オプションについてやってくれるライブラリが欲しい
コマンドラインで指定があればそれを、なければ環境変数を、それもなければ設定ファイルを、どれもなければデフォルト値を読む
っていう動作を各オプションについてやってくれるライブラリが欲しい
415デフォルトの名無しさん
2022/05/31(火) 00:42:08.60ID:M2U43b0K clap+argfileでいけるかな?
416デフォルトの名無しさん
2022/05/31(火) 05:48:32.37ID:V7u6lubL 大量じゃなければdotenv+clapで列挙していけばいいね
#[derive(Parser)]
struct Args {
#[clap(long, env = "TEST_NAME", default_value = "デフォルト値")]
test_name: String,
}
dotenv::from_filename("設定ファイル名").ok();
let args = Args::parse();
println!("{}", args.test_name);
argsをparseする前にdotenvで設定ファイルから環境変数へ流し込んでおくと
CLI引数→環境変数→設定ファイル→デフォルト値の順
#[derive(Parser)]
struct Args {
#[clap(long, env = "TEST_NAME", default_value = "デフォルト値")]
test_name: String,
}
dotenv::from_filename("設定ファイル名").ok();
let args = Args::parse();
println!("{}", args.test_name);
argsをparseする前にdotenvで設定ファイルから環境変数へ流し込んでおくと
CLI引数→環境変数→設定ファイル→デフォルト値の順
417デフォルトの名無しさん
2022/05/31(火) 10:19:23.69ID:aYJaA5wp418デフォルトの名無しさん
2022/05/31(火) 14:58:10.34ID:qkI00F5r419デフォルトの名無しさん
2022/05/31(火) 20:23:20.27ID:/PJVfDdU env feature指定すると扱える
あと今時の形式>>416ではderive featureも必須
あと今時の形式>>416ではderive featureも必須
420デフォルトの名無しさん
2022/05/31(火) 21:26:01.43ID:bCRscqs9421デフォルトの名無しさん
2022/06/03(金) 21:24:55.91ID:3LVnIAMZ 配列の中で移動コピーする方法を教えてください
例えば
移動前 [X, X, X, X, 4, 5, 6, 7, 8, 9]
移動後 [4, 5, 6, 7, 8, 9, X, X, X, X];
Xは任意の値で構わないです
可能ならばstable safeでお願いします
例えば
移動前 [X, X, X, X, 4, 5, 6, 7, 8, 9]
移動後 [4, 5, 6, 7, 8, 9, X, X, X, X];
Xは任意の値で構わないです
可能ならばstable safeでお願いします
422デフォルトの名無しさん
2022/06/03(金) 21:51:48.48ID:zWyAdBA8 複おじか?お前
423デフォルトの名無しさん
2022/06/03(金) 21:58:58.40ID:58QZIwzn >>421
xs.rotate_left(4);
xs.rotate_left(4);
424デフォルトの名無しさん
2022/06/03(金) 22:49:16.06ID:/2hdnJHh コピーとあるからcopy_within(4.., 0)でいいんじゃないか
rotate_leftだと大きな配列で後方と前方の間の小さいサイズのコピーでも全体のコピーが発生して無駄
rotate_leftだと大きな配列で後方と前方の間の小さいサイズのコピーでも全体のコピーが発生して無駄
425デフォルトの名無しさん
2022/06/03(金) 23:22:12.53ID:58QZIwzn なるほど、任意の値で構わないってのはそういうことだったのか
426デフォルトの名無しさん
2022/06/03(金) 23:55:24.30ID:3LVnIAMZ ありがとうございました
ところで文字列にはfindメソッドがあって便利なのですが
指定した値が配列の中で前から何番目にあるかを返すメソッドはありますか?
ところで文字列にはfindメソッドがあって便利なのですが
指定した値が配列の中で前から何番目にあるかを返すメソッドはありますか?
427デフォルトの名無しさん
2022/06/04(土) 00:13:56.42ID:1UnvA590 >>426
slice::iter::position
slice::iter::position
428デフォルトの名無しさん
2022/06/04(土) 00:40:32.70ID:oXzC1k// positionでもfindでも行ける
let buf = b"abc\ndef\n";
assert_eq!(Some(3), buf.iter().position(|&b| b == b'\n'));
assert_eq!(Some(3), (0..buf.len()).find(|&i| buf[i] == b'\n'));
文字列でのこの簡潔さと比べるとスライス直結findが欲しくなるのはわかる
let str = "abc\ndef\n";
assert_eq!(Some(3), str.find('\n'));
let buf = b"abc\ndef\n";
assert_eq!(Some(3), buf.iter().position(|&b| b == b'\n'));
assert_eq!(Some(3), (0..buf.len()).find(|&i| buf[i] == b'\n'));
文字列でのこの簡潔さと比べるとスライス直結findが欲しくなるのはわかる
let str = "abc\ndef\n";
assert_eq!(Some(3), str.find('\n'));
429デフォルトの名無しさん
2022/06/04(土) 00:48:39.66ID:SnRPHFsS bikeshed
430デフォルトの名無しさん
2022/06/04(土) 01:04:34.73ID:oXzC1k// str::findは部分列も対応
let str = "abc\r\ndef\r\n";
assert_eq!(Some(3), str.find("\r\n"));
なぜslice::findを作らなかったのだろう?
let str = "abc\r\ndef\r\n";
assert_eq!(Some(3), str.find("\r\n"));
なぜslice::findを作らなかったのだろう?
431デフォルトの名無しさん
2022/06/04(土) 09:04:26.92ID:LG8suQe9 出た
汚コード
汚コード
432デフォルトの名無しさん
2022/06/04(土) 09:19:04.11ID:UQf/W43E Rustの仕様自体が汚いんだよ
433デフォルトの名無しさん
2022/06/04(土) 09:34:38.78ID:nKFWMn7j 汚コードでもいいやん
反面教師になるんだから
ただし単発の短いコードに限る
フィボナッチ汚コードのペタペタ連投みたいなのはもう勘弁
反面教師になるんだから
ただし単発の短いコードに限る
フィボナッチ汚コードのペタペタ連投みたいなのはもう勘弁
434デフォルトの名無しさん
2022/06/04(土) 09:56:15.67ID:kJkfvymC 汚コードなの?初心者だからマジわからん
docのstd::slice::iter::position をみたら似たようなコードだったけど
docのstd::slice::iter::position をみたら似たようなコードだったけど
435デフォルトの名無しさん
2022/06/04(土) 10:11:21.31ID:SnRPHFsS >>430
sliceから部分sliceを探索する頻度が文字列から部分文字列を探索する頻度に比べて圧倒的に低いから、じゃないの
C++のSTLも文字列にしかメンバ関数としてのfindは無いし、これも同じ理由ではないかな
sliceから部分sliceを探索する頻度が文字列から部分文字列を探索する頻度に比べて圧倒的に低いから、じゃないの
C++のSTLも文字列にしかメンバ関数としてのfindは無いし、これも同じ理由ではないかな
436デフォルトの名無しさん
2022/06/04(土) 11:23:20.02ID:HjDRTZ3n Rustのエラー表示すばらしいなほんとに
めちゃくちゃ楽だわな
めちゃくちゃ楽だわな
437デフォルトの名無しさん
2022/06/04(土) 12:01:38.84ID:K/Ra00gu いつも汚コード言ってるやつはキチガイだから無視しとけ
>>430
部分スライスに対してもiterの代わりにwindowsを使えば同じようにpositionで部分文字列findと同じ結果を得られる
let buf = b"abc\r\ndef\r\n";
assert_eq!(Some(3), buf.windows(2).position(|b| b == b"\r\n"));
>>430
部分スライスに対してもiterの代わりにwindowsを使えば同じようにpositionで部分文字列findと同じ結果を得られる
let buf = b"abc\r\ndef\r\n";
assert_eq!(Some(3), buf.windows(2).position(|b| b == b"\r\n"));
438デフォルトの名無しさん
2022/06/04(土) 12:02:08.90ID:rPOcVTB8 エラー表示が出ている時点で(ry
439デフォルトの名無しさん
2022/06/04(土) 12:43:02.16ID:SnRPHFsS bikeshed bikeshed bikeshed
440デフォルトの名無しさん
2022/06/04(土) 13:12:11.67ID:sY7vYVfw 文字列のPatternに相当するものがsliceになないからでは
441デフォルトの名無しさん
2022/06/04(土) 13:40:33.24ID:NhLlWR3w442デフォルトの名無しさん
2022/06/04(土) 13:47:22.44ID:DNUj2Sn5 汚コード公式汚コードですわ~!
443デフォルトの名無しさん
2022/06/04(土) 13:57:36.96ID:nieqt9o7444デフォルトの名無しさん
2022/06/04(土) 14:11:57.60ID:QZjOvH6O こんなスレに質問しに来る初学者なんてものは最初から存在しないんだろうな
445デフォルトの名無しさん
2022/06/04(土) 14:23:56.41ID:ThNWOKir ん?
「初心者だからわからん」というのが汚コーダーの自演だろってこと?
「初心者だからわからん」というのが汚コーダーの自演だろってこと?
446デフォルトの名無しさん
2022/06/04(土) 14:34:25.51ID:QAuL8N6o そうだよ
447デフォルトの名無しさん
2022/06/04(土) 14:39:18.00ID:xn39310Q 複クンはね
みんなに見てもらいたいんよ
つきあってあげてよ
みんなに見てもらいたいんよ
つきあってあげてよ
448デフォルトの名無しさん
2022/06/04(土) 15:03:39.84ID:Skn9YyLT449434
2022/06/04(土) 15:21:18.99ID:kJkfvymC 自演臭くなるからアレなんだけど
暇潰しに公式ドキュメントと照らし合わせて疑問に思ったから書き込んだだけで
ただの通りすがりだからね
暇潰しに公式ドキュメントと照らし合わせて疑問に思ったから書き込んだだけで
ただの通りすがりだからね
450デフォルトの名無しさん
2022/06/04(土) 15:39:42.64ID:nieqt9o7451デフォルトの名無しさん
2022/06/04(土) 16:10:13.56ID:VXQtFnUU 書いてあるコードよりましなコードを出せずに汚コードって呟くしかない可哀想な人は暖かくスルーしてやってくださいな
452デフォルトの名無しさん
2022/06/04(土) 16:13:38.80ID:jusi9BoA453デフォルトの名無しさん
2022/06/04(土) 16:30:17.39ID:43LVHAPc454デフォルトの名無しさん
2022/06/04(土) 21:35:57.57ID:Tzl373uA うわーこれ確定じゃん
複くんRustなんかやめてネトサポやれば?
複くんRustなんかやめてネトサポやれば?
455デフォルトの名無しさん
2022/06/04(土) 23:04:11.48ID:FBgyqIef >フルボッコにされて撃沈。
主砲「Copyはディープで高コストだから避けるべき」発射! ==> ドッカーンwww撃沈www
主砲「Copyはディープで高コストだから避けるべき」発射! ==> ドッカーンwww撃沈www
456デフォルトの名無しさん
2022/06/04(土) 23:12:57.28ID:DCKDFwmc 真面目に書いとくとusizeみたいな数値プリミティブの場合はCopy前提で全く問題ないよ
気になる人はベンチにかけてね
気になる人はベンチにかけてね
457デフォルトの名無しさん
2022/06/04(土) 23:38:03.39ID:UrkwxQuP458デフォルトの名無しさん
2022/06/04(土) 23:52:08.43ID:W82CC99g 汚コード連呼厨は信頼できない
代わりのコードをいつも出せない
珍しく出してきたら元より劣化してた
代わりのコードをいつも出せない
珍しく出してきたら元より劣化してた
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 日本行き空路49万件キャンセル 中国自粛呼びかけ 日本行きチケット予約の約32%に相当 ★4 [ぐれ★]
- 【音楽】Perfume・あ~ちゃんの結婚相手「一般男性」は吉田カバンの社長・吉田幸裕氏(41) 高身長で山本耕史似 [Ailuropoda melanoleuca★]
- 【大分】佐賀関で大規模火災、170棟以上が延焼中 70代男性1人と連絡取れず [ぐれ★]
- 【サッカー】U-17日本代表、激闘PK戦制す 北朝鮮撃破で6大会ぶり8強入り U17W杯 [久太郎★]
- 【インバウンド】中国人観光客の日本での消費額は年間約2兆円超…中国政府は公務員の出張取り消し [1ゲットロボ★]
- 【サッカー】日本代表、ボリビアに3発快勝 森保監督通算100試合目を飾る…鎌田、町野、中村がゴール [久太郎★]
- アンケート調査で「高市発言は問題なし」 93.5%wwwwwwwwwwwwwwwwwwwwwwwww [279254606]
- 自閉症が「んなっしょい」と連呼するお🏡
- 【画像】エロい一般漫画はなぜこんなに抜けるのか
- 日本人の海外旅行したきのマナーよくなったのはいつから
- BTSのバラエティ面白すぎワロタ
- 寝癖ってどうしたらつかなくなるんや?
