1 名前:デフォルトの名無しさん mailto:sage [2021/11/07(日) 10:04:59.35 ID:pJhT3MIE.net] 公式 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の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 part12 https://mevius.5ch.net/test/read.cgi/tech/1629813327/
321 名前:デフォルトの名無しさん mailto:sage [2021/12/19(日) 06:54:36.03 ID:KXG/wmTu.net] >>314 ワンライナー大好きかよ
322 名前:デフォルトの名無しさん mailto:sage [2021/12/19(日) 07:00:31.55 ID:1R2jF/rb.net] >>315 マルチラインだと標準ライブラリだけでもわかりやすくなる?
323 名前:デフォルトの名無しさん mailto:sage [2021/12/19(日) 08:28:47.39 ID:KXG/wmTu.net] >>316 あいやごめん。proconioのところはどうあがいてもプロコン専用のproconioが一番見やすいよ。それ用に特化されたライブラリだし 俺が大好きかよって言ったのは println!("{}", if v.into_iter().any(|n| n & 1 == 0) { "Even" } else { "Odd" }); の部分
324 名前:デフォルトの名無しさん mailto:sage [2021/12/19(日) 09:08:15.26 ID:1R2jF/rb.net] どの言語でも三項演算子(相当)はワンライナーで書くんじゃね?
325 名前:デフォルトの名無しさん mailto:sage [2021/12/19(日) 09:36:51.21 ID:Tv9xxy1h.net] 見た目汚いなw
326 名前:デフォルトの名無しさん mailto:sage [2021/12/19(日) 09:42:08.31 ID:1R2jF/rb.net] これでいいかね? println!("{}", if v.into_iter().any(|n| n & 1 == 0) { "Even" } else { "Odd" });
327 名前:デフォルトの名無しさん [2021/12/19(日) 09:57:56.98 ID:KXG/wmTu.net] 俺ならこんな感じかなあ 俺は頭悪いから、途中結果に一つ一つ名前つけないとわかんなくなっちゃうわ まあワンライナー見た時に「グエー」って思っただけだからごめん。「大好きかよ」とかいっておいてなんだけどあんま気にしないで use proconio::input; fn main() { input!(v: [usize; 5]); let is_even = v.iter().any(|x| x % 2 == 0); let result = if is_even { "Even" } else { "Odd" }; println!("{}", result); }
328 名前:デフォルトの名無しさん mailto:sage [2021/12/19(日) 10:13:36.41 ID:1R2jF/rb.net] >>321 なるほど じゃあ最初の標準ライブラリのみはどのように分けるのかな println!("{}", if BufReader::new(stdin()).lines().next().unwrap().unwrap().split(' ').any(|s| s.parse::<isize>().unwrap() & 1 == 0) { "Even" } else { "Odd" });
329 名前:デフォルトの名無しさん mailto:sage [2021/12/19(日) 10:17:01.07 ID:KXG/wmTu.net] >>322 proconio使うw Rustで競プロするにはIOごときに専用ライブラリ使うことになってなんかなあって思うけど、そう思いながら使う
330 名前:デフォルトの名無しさん mailto:sage [2021/12/19(日) 12:54:53.29 ID:XhCh7cuL.net] >>315 ワンライナーやクロージャでまとめて書くと所有権やライフタイムの問題が出にくいんだよ 他の言語と違ってRustで適切に分割して読みやすく書くのは初心者には難しい
331 名前:デフォルトの名無しさん mailto:sage [2021/12/19(日) 13:44:27.43 ID:JD8Mu2Jr.net] わけわからんくてビビってたらよく見るとPythonスレじゃなかった
332 名前:デフォルトの名無しさん mailto:sage [2021/12/19(日) 15:04:40.83 ID:9UFbsF2U.net] rustfmt使うでしょ普通
333 名前:デフォルトの名無しさん mailto:sage [2021/12/19(日) 21:36:12.89 ID:1R2jF/rb.net] >>326 println全体が改行されてしまった println!( "{}", if BufReader::new(stdin()) .lines() .next() .unwrap() .unwrap() .split(' ') .any(|s| s.parse::<isize>().unwrap() & 1 == 0) { "Even" } else { "Odd" } ); 一方で分割するとこうなった let cond = BufReader::new(stdin()) .lines() .next() .unwrap() .unwrap() .split(' ') .any(|s| s.parse::<isize>().unwrap() & 1 == 0); println!("{}", if cond { "Even" } else { "Odd" }); if式自体はワンライナーーで正解とrustfmtはおっしゃってる
334 名前:デフォルトの名無しさん mailto:sage [2021/12/19(日) 21:50:26.03 ID:gPlFWszB.net] ワンライナー云々はフォーマットの話ではないやろ
335 名前:デフォルトの名無しさん mailto:sage [2021/12/19(日) 22:05:50.34 ID:1R2jF/rb.net] 例えば>>321 がif式を5行に分割しているが それもrustfmtにより1行に修正された Rust標準ライブラリのソースでもワンライナー bool.rs: if self { Some(t) } else { None } result.rs: let n = if self.inner.is_some() { 1 } else { 0 }; time.rs: let prefix = if f.sign_plus() { "+" } else { "" }; >>328 では何の話かね?
336 名前:デフォルトの名無しさん mailto:sage [2021/12/19(日) 22:37:44.04 ID:D79ys1jH.net] 構造と書式を区別できんのはヤバイで
337 名前:デフォルトの名無しさん mailto:sage [2021/12/19(日) 23:10:30.41 ID:ZhiL7Huf.net] 心底どうでもいい。 保守性に貢献するどころかマイナスになるようなクソプライドコードの導入すんなよ。
338 名前:デフォルトの名無しさん mailto:sage [2021/12/19(日) 23:14:48.39 ID:4jRnwXL4.net] また性懲りもなくコードべたべた書いてんのか
339 名前:デフォルトの名無しさん mailto:sage [2021/12/19(日) 23:21:45.51 ID:cDs+Q4pL.net] rustfmtだから書式の話やで
340 名前:デフォルトの名無しさん mailto:sage [2021/12/19(日) 23:25:17.24 ID:/BRS7QS/.net] 区別できなかったからrustfmtを持ち出したんやろ どこに改行入れるべきかって話だと思ったんだろなww
341 名前:デフォルトの名無しさん mailto:sage [2021/12/19(日) 23:41:46.15 ID:1R2jF/rb.net] rustfmtを持ち出したのは俺じゃないぜ あと今回のケースならここは分割するよな let reader = BufReader::new(stdin()); let line = reader.lines().next().unwrap().unwrap(); let is_even = line.split(' ').any(|s| s.parse::<isize>().unwrap() & 1 == 0);
342 名前:デフォルトの名無しさん mailto:sage [2021/12/19(日) 23:48:52.91 ID:m2ZvKw+8.net] 汚コード
343 名前:デフォルトの名無しさん mailto:sage [2021/12/19(日) 23:59:56.43 ID:cDs+Q4pL.net] 問題文が>>314 でこうなってるから >> | 入力は以下の形式で標準入力から数値が与えられる。 >> | a b c d e if let [a, b, c, d, e] = line .splitn(5, ' ') .map(|s| s.parse::<isize>().unwrap()) .collect::<ArrayVec<_, 5>>()[..] { あとこれでいい let is_even = a & b & c & d & e & 1 == 0;
344 名前:デフォルトの名無しさん mailto:sage [2021/12/20(月) 05:23:59.31 ID:XPDM+Al+.net] そういえばいつの間にか let variable = 3; println!("{variable}"); みたいな書き方が出来るんだけどこれ前からだっけ?
345 名前:デフォルトの名無しさん mailto:sage [2021/12/20(月) 05:50:08.07 ID:MpI5dMic.net] >>338 それはまだnightlyだけですよ 来月の1.58からstableになって使えるようになる予定
346 名前:デフォルトの名無しさん mailto:sage [2021/12/20(月) 11:31:40.46 ID:vxPhPqzv.net] >>335 構造化の基本を学びましょう
347 名前:デフォルトの名無しさん mailto:sage [2021/12/20(月) 18:38:24.90 ID:+mZvzmRI.net] どちらのコードも正解
348 名前:デフォルトの名無しさん mailto:sage [2021/12/20(月) 18:57:17.41 ID:rubGoZ9q.net] コードに「間違い」はあっても「正解」はない
349 名前:デフォルトの名無しさん mailto:sage [2021/12/20(月) 19:04:29.92 ID:MpI5dMic.net] 間違っているコードは出ていないような 問題視してる人は具体的に何を問題にしているの?
350 名前:デフォルトの名無しさん mailto:sage [2021/12/20(月) 20:55:59.37 ID:lwZpjeWf.net] アスぺ思考はこれだから
351 名前:デフォルトの名無しさん mailto:sage [2021/12/21(火) 11:25:19.41 ID:TTfv6HaA.net] https://doc.rust-jp.rs/book-ja/ch18-03-pattern-syntax.html#%E3%83%9E%E3%83%83%E3%83%81%E3%82%AC%E3%83%BC%E3%83%89%E3%81%A7%E8%BF%BD%E5%8A%A0%E3%81%AE%E6%9D%A1%E4%BB%B6%E5%BC%8F ここの最後のところに パターンと関わるマッチガードの優先度は、以下のように振る舞います: (4 | 5 | 6) if y => ... 以下のようにではありません: 4 | 5 | (6 if y) => ... とあるんですが、後者のようになってほしい場合は4|5と6 if yを別々に書くしか無いですか?
352 名前:デフォルトの名無しさん mailto:sage [2021/12/21(火) 11:56:47.99 ID:BV9oeByN.net] >>345 ガード構文がこう「『Pattern』 if 『Expression』」なのでそうなりますね
353 名前:デフォルトの名無しさん mailto:sage [2021/12/22(水) 20:44:35.79 ID:7pEHjDF/.net] sixtyfpsってどう?
354 名前:デフォルトの名無しさん mailto:sage [2021/12/22(水) 22:58:00.27 ID:mfli1g17.net] > しかし競プロでみんなproconioとかいう謎の専用ライブラリ使ってるの見た目悪すぎて笑える いや、ほぼ公認のクレートなんだが・・・ 謎の専用ライブラリとかいってる時点で、お察しか? あと、見た目悪いってどういうことなんかね includeしたら見た目悪すぎなわけ?
355 名前:デフォルトの名無しさん [2021/12/22(水) 23:53:48.10 ID:Wk3NOZd2.net] Rust bookの以下の記述について質問です https://doc.rust-jp.rs/book-ja/ch19-05-advanced-functions-and-closures.html#クロージャを返却する > 以下のコードは、クロージャを直接返そうとしていますが、コンパイルできません: > > fn returns_closure() -> Fn(i32) -> i32 { > |x| x + 1 > } > コンパイラには、クロージャを格納するのに必要なスペースがどれくらいかわからないのです。 > この問題の解決策は先ほど見かけました。 > > fn returns_closure() -> Box<Fn(i32) -> i32> { > Box::new(|x| x + 1) > } とBox化しなさいと書かれているのですが 以下のようにimplを付けるとBoxを使わなくてもコンパイルが通り動きました fn make_closure_add1() -> impl Fn(i32) -> i32 { |x| x + 1 } このimpl付加は暗に自動的にBox化されているということなのでしょうか?
356 名前:デフォルトの名無しさん mailto:sage [2021/12/23(木) 00:23:38.98 ID:p+r9sE2/.net] ここを読む https://doc.rust-lang.org/book/ch19-05-advanced-functions-and-closures.html#returning-closures
357 名前:デフォルトの名無しさん mailto:sage [2021/12/23(木) 07:21:11.33 ID:esNMmzKz.net] >>348 そりゃあcratesio に上がったものは空っぽでもゴミでも全部公認だわなw
358 名前:デフォルトの名無しさん mailto:sage [2021/12/23(木) 15:17:54.33 ID:BEeWZFks.net] >>342 逆だ、コードは常に「正解」で動いていて「間違い」ない。 あんたの書いたバグもコンピューターにとっては一部の隙もなく正解であり、書かれたその通りに動き、無慈悲である。 同じ目的で、多数、あるいは二人の人が書いたコードで違いが出るのは「表現の違い」であり「間違い」と決めつける のは人間の主観や嗜好でしかなく、仮にコードへ正誤を求めるなら明確に表現できていなればならず、矛盾が生じる
359 名前:デフォルトの名無しさん mailto:sage [2021/12/23(木) 15:32:21.87 ID:GoKXBRn5.net] コンパイルが通らないコードも正解なのかい?
360 名前:デフォルトの名無しさん mailto:sage [2021/12/23(木) 15:39:30.16 ID:9VjYa60R.net] えらいポエミーやな
361 名前:デフォルトの名無しさん mailto:sage [2021/12/23(木) 18:55:13.24 ID:TD851Muu.net] ”動いていて”と言っているからコンパイルは通ってる前提だろう、”コードへ正誤を求める”といっているから 仮にコンパイルが通らないコードは明確にそれ(誤り・間違い)が表現できている ポエミーなのはその通りだろう
362 名前:デフォルトの名無しさん mailto:sage [2021/12/23(木) 21:22:53.78 ID:NwYcCv97.net] >>349 Boxとはヒープを使うということです Rustではコードで明示的に指定しない限り勝手にヒープが使われることはないです (もちろんBox以外にもVecやStringなどヒープを使うものを使ってもそれは明示的に指定したことになります) その Box<Fn(i32) -> i32> は今は Box<dyn Fn(i32) -> i32> と書く必要があります では本題の impl Fn(i32) -> i32 と書いた場合はどうなるのでしょうか? 以下のように3種類のクロージャを作ってサイズや型を表示させてみると fn main() { let direct_closure = |x: i32| x + 1; let impl_closure = make_impl_closure(); let box_closure = make_box_closure(); println!("{} {}", std::mem::size_of_val(&direct_closure), type_of(&direct_closure)); println!("{} {}", std::mem::size_of_val(&impl_closure), type_of(&impl_closure)); println!("{} {}", std::mem::size_of_val(&box_closure), type_of(&box_closure)); } fn make_impl_closure() -> impl Fn(i32) -> i32 { |x| x + 1 } fn make_box_closure() -> Box<dyn Fn(i32) -> i32> { Box::new(|x| x + 1) } fn type_of<T>(_: &T) -> &'static str { std::any::type_name::<T>() } 実行結果は以下のように表示されます 0 tmp::main::{{closure}} 0 tmp::make_impl_closure::{{closure}} 16 alloc::boxed::Box<dyn core::ops::function::Fn<(i32,)>+Output = i32> つまりimplでは直接クロージャ指定したのと全く同じです (上記では定義した関数名だけが異なる)
363 名前:デフォルトの名無しさん mailto:sage [2021/12/23(木) 21:33:09.04 ID:soQwByyI.net] 今日はポエマー多いなw
364 名前:デフォルトの名無しさん mailto:sage [2021/12/23(木) 22:34:57.88 ID:NwYcCv97.net] では常に impl を使えばよいのかというと 以下のような条件によって異なるクロージャを返す時 ここで Box を使わず impl Fn(i32) -> i32 にしようとすると 2つのクロージャの型が違うとコンパイラに怒られます fn make_closure(curry: Option<i32>) -> Box<dyn Fn(i32) -> i32> { if let Some(curry) = curry { Box::new(move |x| x + curry) } else { Box::new(|x| x + 1) } } 結局クロージャでない場合と同じ話で 同じトレイトでも型が異なるものが同居する時にBox化します >>349 のRust bookの例はBox化が不要なケースでBox化だから混乱しますね
365 名前:デフォルトの名無しさん mailto:sage [2021/12/24(金) 11:53:17.86 ID:8qqh3vKr.net] コンパイル通って
366 名前:黷ホ全て正解とかバカ丸出し。 厳密な定義でも使えない定義があるってことすら理解してなさそう。 [] [ここ壊れてます]
367 名前:デフォルトの名無しさん [2021/12/24(金) 12:05:46.49 ID:0hdsBqvb.net] 型安全だったらコンパイル通れば実行時エラーにならないという点で全て正解っていうのは別に間違ってないと思うけど? これにケチつけるのは流石にどうかと
368 名前:デフォルトの名無しさん mailto:sage [2021/12/24(金) 12:44:01.96 ID:2tHLRFeD.net] バカ丸出しにお前バカだろとわざわさ言うのもバカなんじゃなかろうか
369 名前:デフォルトの名無しさん mailto:sage [2021/12/24(金) 15:42:15.21 ID:8qqh3vKr.net] >>360 実行時エラーにならないなんて最低限のところだっつーの。だからバカだっていうんだよ。
370 名前:デフォルトの名無しさん [2021/12/24(金) 16:05:46.66 ID:GD01KKAb.net] もしかしてrustはlinuxに取り込まれるわけねーだろって言い張っていた人? 予言外していたよね。お疲れ様です。
371 名前:デフォルトの名無しさん mailto:sage [2021/12/24(金) 16:08:19.93 ID:7q1GmIfa.net] バカをスルーできないバカっているよねー >>364 お前の事な
372 名前:デフォルトの名無しさん [2021/12/24(金) 16:10:39.10 ID:GD01KKAb.net] なんか草
373 名前:デフォルトの名無しさん [2021/12/24(金) 16:20:12.59 ID:GD01KKAb.net] 25 デフォルトの名無しさん sage 2021/04/27(火) 08:00:23.09 ID:/+bIFNU8 >>23 あのね。。書けばそうなるってものじゃなくてそれを実装しなきゃならんのよ。。 コンパイラにそういったコンテクストを判断させるのがめちゃくちゃ難しいっていってるでしょ? なんでそんなに読み取れないの? 27 デフォルトの名無しさん sage 2021/04/27(火) 16:10:45.63 ID:/+bIFNU8 >>26 だからそのコードじゃpanic捉えきれねーからカーネルに入れるわけねーだろって 言ってんじゃん。。何読んでんだよ。 28 デフォルトの名無しさん sage 2021/04/27(火) 18:23:48.67 ID:n/AWrch2 まあ半年後どうなるかで誰が正しかったかは分かるわな 29 デフォルトの名無しさん sage 2021/04/27(火) 20:32:29.92 ID:/+bIFNU8 半年も経たなくてももうわかってるっつーの。。だからちゃんと英語の勉強しましょうね。 完全に同一人物だよね
374 名前:デフォルトの名無しさん [2021/12/24(金) 16:26:02.78 ID:GD01KKAb.net] https://lkml.org/lkml/2021/12/6/461 英語読めんならこれになんて書かれているのかわかるよね?
375 名前:デフォルトの名無しさん [2021/12/24(金) 16:31:02.04 ID:GD01KKAb.net] 予想が完全に外れたID:8qqh3vKrを晒し上げ♪♪♪ ここまで簡単な予想を外すとかバカ過ぎて生きていけなさそうwww 馬鹿丸出しですねwwwwww
376 名前:デフォルトの名無しさん mailto:sage [2021/12/24(金) 16:40:31.03 ID:8qqh3vKr.net] 素でバカなんだな。。もうコンパイル通ったんで俺の仕事終わりとか現場で言ってろよ。。話にもならん。
377 名前:デフォルトの名無しさん [2021/12/24(金) 16:42:14.31 ID:/xk3NPni.net] >>362 最低限の性質を満たしている⇔正解って言ってんじゃん。。何読んでんだよ。 なんでそんなに読み取れないの? だからバカだっていうんだよ。 だからちゃんと日本語の勉強しましょうね。
378 名前:デフォルトの名無しさん [2021/12/24(金) 16:45:16.93 ID:/xk3NPni.net] >>369 なお予言を外したことについては一貫してノータッチwwwww 話をしたくないのは君だよねwwwwww
379 名前:デフォルトの名無しさん [2021/12/24(金) 16:46:19.44 ID:/xk3NPni.net] >>369 同一人物だってことはバレバレだっつーの。バカ丸出し。wwwwwwwwww
380 名前:デフォルトの名無しさん mailto:sage [2021/12/24(金) 17:12:05.04 ID:jmk0MHfo.net] どうでもええわRustの話しろ
381 名前:デフォルトの名無しさん mailto:sage [2021/12/24(金) 17:38:56.03 ID:8qNIErj3.net] 厳密な定義でも使えない定義?Rustに特定条件下でCのような未定義になる動作あったっけ?
382 名前:デフォルトの名無しさん mailto:sage [2021/12/24(金) 18:41:11.93 ID:759ZBatD.net] スレの文脈はしらんけど、 Rustではunsafeを使ってなければコンパイラが、未定義動作が起きないということや、データ競合がないことを保証をしてくれるよ
383 名前:デフォルトの名無しさん [2021/12/24(金) 19:10:24.57 ID:/xk3NPni.net] >>369 予言外れましたよね?wwwwwwww
384 名前:デフォルトの名無しさん mailto:sage [2021/12/25(土) 15:28:33.08 ID:lsYj53Mi.net] Rustでフロントエンドしてる奴おる?
385 名前:デフォルトの名無しさん [2021/12/26(日) 12:56:45.57 ID:NwCcamJz.net] Rustの勉強を昨日から開始した。後は構造体とかかな。
386 名前:デフォルトの名無しさん mailto:sage [2021/12/26(日) 17:26:13.09 ID:r
] [ここ壊れてます]
387 名前:Nqv+UWs.net mailto: コード貼ったら糞だボケだゴミだと自称上級者に罵倒されるから注意しろ [] [ここ壊れてます]
388 名前:デフォルトの名無しさん mailto:sage [2021/12/26(日) 19:27:36.42 ID:IL2U4vJU.net] Rustはこう謳っている >なぜRustか? >パフォーマンス >信頼性 >生産性 真っ向から反するコードを貼ってりゃゴミ・クソ言われて当然なんだよなぁ
389 名前:デフォルトの名無しさん [2021/12/26(日) 19:29:23.79 ID:Haex5ds9.net] すまんが、配列に入った数値の平均ってパッと出せないもんなの? 他言語でふにゃふにゃになった俺の頭でコードを書いたら、桁の溢れとか精度とか酷えことになりそう・・・・
390 名前:デフォルトの名無しさん mailto:sage [2021/12/26(日) 20:24:04.94 ID:s+fXV5dW.net] コードもゴミだったがそれ以上に考え方がゴミだったからな
391 名前:デフォルトの名無しさん mailto:sage [2021/12/26(日) 20:42:21.32 ID:M+F+5/6j.net] >>381 これ使ったらよいのでは https://docs.rs/streaming-stats/0.2.3/stats/fn.mean.html
392 名前:デフォルトの名無しさん mailto:sage [2021/12/26(日) 22:30:25.75 ID:L9HJqboW.net] >>381 普通に平均を求めるだけではダメなのでしょうか? fn main() { assert_eq!(5.5, (1..=10).average()); assert_eq!(6.8, [2.3, 8.7, 9.4].average()); } use num::ToPrimitive; trait Average { fn average(self) -> f64; } impl<I> Average for I where I: IntoIterator, <I as IntoIterator>::Item: ToPrimitive, { fn average(self: I) -> f64 { self.into_iter().fold((0.0, 1.0), |(ave, size), n| (ave + (n.to_f64().unwrap() - ave) / size, size + 1.0)).0 } }
393 名前:デフォルトの名無しさん mailto:sage [2021/12/27(月) 00:09:24.17 ID:wxukv015.net] カハンの加算アルゴリズムというのがある
394 名前:デフォルトの名無しさん mailto:sage [2021/12/27(月) 09:11:03.63 ID:9DXmjbrK.net] 汚コードキタ━!
395 名前:デフォルトの名無しさん mailto:sage [2021/12/27(月) 10:50:10.93 ID:BFpPIAiX.net] 何でもトレイト化するアホ
396 名前:デフォルトの名無しさん mailto:sage [2021/12/27(月) 12:29:15.17 ID:PxL7gTAR.net] ゴミをゴミだといって何が悪い!
397 名前:デフォルトの名無しさん [2021/12/27(月) 12:32:52.22 ID:OyINMfYQ.net] ここの人たちってplaygroundとかなんで完全に動かせるコードで提示しないんだろ・・・? アドバイス貰うにも回答するにも一生懸命スペース全角置換したり、まじ両方キモイw trait Averagewwwww
398 名前:デフォルトの名無しさん mailto:sage [2021/12/27(月) 13:09:28.61 ID:PX/mZ8bI.net] こう言う時って普通の関数にしちゃいかんの?
399 名前:デフォルトの名無しさん mailto:sage [2021/12/27(月) 14:19:38.18 ID:Btn3kp2t.net] 普通の関数にすべきかどうかはメソッドチェーンにしたいかどうかで判断すればよろしい
400 名前:デフォルトの名無しさん mailto:sage [2021/12/27(月) 14:43:10.42 ID:0vghZEjd.net] >>389 playgroundでは自己顕示欲が満たせないんだよw まあplaygroundでは動かせないコードもあるけどな
401 名前:デフォルトの名無しさん mailto:sage [2021/12/27(月) 15:03:42.29 ID:6JVZDUUj.net] >>381 こういう子は、移動平均出したくなった時とかどうすんだろ… 愚直に毎回平均出す関数とか使っちゃうわけ?
402 名前:デフォルトの名無しさん [2021/12/27(月) 21:04:27.03 ID:K3JIQJJi.net] しょうがない、一応は専門家が書いているであろう他言語の実装を参考にしよう・・・・ https://source.dot.net/#System.Linq/System/Linq/Average.cs,2b4701af991d5425 俺様、信頼して使っていたメソッドの衝撃の事実を知る
403 名前:デフォルトの名無しさん mailto:sage [2021/12/27(月) 21:09:19.15 ID:h+0xE8z4.net] 浮動小数点型ならそういう素直な実装で十分だよ
404 名前:デフォルトの名無しさん [2021/12/27(月) 21:53:06.04 ID:N7w3YVE+.net] >>384 それだと桁溢れは防止できているが誤差蓄積の対処ができていない もう一つパラメタを増やしてこうしたほうがいい fn average(self: I) -> f64 { self.into_iter().fold((0.0, 1.0, 0.0), |(ave, size, fix), n| { let diff = (n.to_f64().unwrap() - ave) / size - fix; let new_ave = ave + diff; (new_ave, size + 1.0, (new_ave - ave) - diff) }).0 } >>387 イテレータメソッド化するにはそのためのtrait宣言が必須 もしわからないならitertoolsなどのイテレータ拡張ライブラリを見よう >>389 標準ライブラリのsum()がtrait Sumを使っているからtrait Averageでもまあいいとは思う ただし今回はイテレータメソッド拡張のみに用いているようだからtrait IteratorExtなどの命名がわかりやすいとは思う
405 名前:デフォルトの名無しさん mailto:sage [2021/12/27(月) 21:56:50.25 ID:20E7BwbM.net] IteratorExt大草原、まじに入院してほしいw
406 名前:デフォルトの名無しさん mailto:sage [2021/12/27(月) 22:01:57.73 ID:6/3kWl6D.net] イテレータメソッドにする必要ある?
407 名前:デフォルトの名無しさん [2021/12/27(月) 22:15:24.91 ID:N7w3YVE+.net] >>398 標準ライブラリにおいてsum()やproduct() それを一般化したfold()やreduce() さらにmax()やmin()など当然イテレータメソッドになっている むしろ今回のaverage()だけをイテレータメソッドにしない理由が見当たらない
408 名前:デフォルトの名無しさん mailto:sage [2021/12/27(月) 22:20:18.56 ID:6/3kWl6D.net] >>399 じゃあなんで標準ライブラリにないの?
409 名前:デフォルトの名無しさん mailto:sage [2021/12/27(月) 22:25:16.01 ID:h+0xE8z4.net] カハンの加算使ったのか
410 名前:デフォルトの名無しさん mailto:sage [2021/12/27(月) 22:31:56.63 ID:/o/Y1bP3.net] >>400 入力型と出力型で大量の組み合わせ(例:i32→f32)が用途に応じて要求されるのと 単純に合計をサイズで割った平均でよい用途もあれば 件数が多いと合計がオーバーフローするからその対策が欲しい用途もあれば 桁が大きく異なるデータ列の場合に浮動小数点の誤差改善が欲しい用途など多岐にわたる だから平均を標準ライブラリで何か一つ用意は無理
411 名前:デフォルトの名無しさん mailto:sage [2021/12/27(月) 22:51:58.74 ID:Btn3kp2t.net] 単にこれまで標準ライブラリに入れようとした人がいなかったか そういう人はいたが必要性を説得できなかっただけでしょう sumやproductに比べるとユースケース限られるしね
412 名前:デフォルトの名無しさん mailto:sage [2021/12/27(月) 23:21:10.48 ID:iNGO9QKv.net] "ave"のせいで頭に入ってこない
413 名前:デフォルトの名無しさん mailto:sage [2021/12/28(火) 00:10:56.21 ID:THzUMFur.net] 「件数が多いと合計がオーバーフローするからその対策が欲しい用途」そんな考えがオカシイ sumですらオーバーフローに言及しているだけで対策が欲しいから、だからstdじゃないという理由では無い https://doc.rust-lang.org/std/iter/trait.Iterator.html#panics-3 When calling sum() and a primitive integer type is being returned, this method will panic if the computation overflows and debug assertions are enabled. 必要性を説得出来ないだけというのが正しい。浮動小数の加減算による誤差蓄積だって、浮動小数を扱うなら当然起こることだが 誤差改善が欲しい用途があるからstdじゃないとか嘘ばっかり言わないで?おまえさ、迷惑だからRust辞めてくれよ? 最小限、分かったふりで糞まき散らすな?
414 名前:デフォルトの名無しさん mailto:sage [2021/12/28(火) 00:45:10.69 ID:vzPVHyZI.net] >>405 それは君が無知 平均算出にはsumを求めずとも差分を逐次的に適用するアルゴリズムがあるoverflowを回避する対策で一般的に使われている 例えば>>383 のstatsもその方法で平均を算出している sumの例を出すのは見当違い
415 名前:デフォルトの名無しさん mailto:sage [2021/12/28(火) 00:52:41.14 ID:We8KhoPF.net] >>406 アルゴリズムの話じゃなくてstdに入ってない理由の説明がおかしいという指摘だと思うよ 言葉汚いし何言ってるかわかりづらいけど
416 名前:デフォルトの名無しさん mailto:sage [2021/12/28(火) 01:20:29.34 ID:vzPVHyZI.net] >>407 stdに入ってない理由? 一長一短ある複数のアルゴリズムがあるから外部でいいだろう
417 名前:デフォルトの名無しさん mailto:sage [2021/12/28(火) 01:57:17.15 ID:We8KhoPF.net] >>408 その理屈だとsortも該当するが そもそも前提としてaverageをstd
418 名前:デフォルトの名無しさん mailto:sage [2021/12/28(火) 02:00:22.76 ID:We8KhoPF.net] >>409 途中で書き込んでしまった そもそもaverageか類似の関数をstdに取り込む議論が過去にあったならそれをポイントしてほしい
419 名前:デフォルトの名無しさん mailto:sage [2021/12/28(火) 02:37:31.31 ID:vzPVHyZI.net] 多数あり外部で十分派なのでそこは興味ない sortは2種類しかなく2種類とも標準ライブラリでサポートしている
420 名前:デフォルトの名無しさん mailto:sage [2021/12/28(火) 09:30:51.41 ID:y5zg5Cpt.net] >>411 じゃ一番メジャーな外部ライブラリを教えてよ
421 名前:デフォルトの名無しさん [2021/12/28(火) 10:24:44.25 ID:ZpntEDp9.net] 外部で十分と言えば、cratesは先着順で名前取れるからこの先優良ライブラリ程クソみたいな名前になっていくよね