[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 1001- 2ch.scのread.cgiへ]
Update time : 11/05 10:37 / Filesize : 296 KB / Number-of Response : 1021
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

Rust part15



1 名前:デフォルトの名無しさん mailto:sage [2022/05/12(木) 18:28:20.99 ID:cuIcFT6k.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を学ぶ際に犯しがちな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/

101 名前:デフォルトの名無しさん mailto:sage [2022/05/18(水) 07:08:20 ID:bcZKOTNR.net]
大きいフィールドを持つ型には、Copyは実装しないだろうし普通はCopy/Moveのコスト差を気にすることなくない?
どちらにすべきかボーダーが難しいことはありそうだけど

102 名前:デフォルトの名無しさん mailto:sage [2022/05/18(水) 07:14:11 ID:P5Km+xQv.net]
>>94
データフローを見直して単純に消せるclone/copyは消せってことか?
それこそ今更すぎるわ
単純に消せないところまで消した後、さらにパフォーマンス改善するにはどうするかってことで、参照の話か?って聞いたんだけど

どこの誰とも知れないやつのフィボナッチのコードに対する指摘をされても知らねーよ
問題があって対策が分かってるなら自分で直すがいい

103 名前:デフォルトの名無しさん mailto:sage [2022/05/18(水) 07:41:25.51 ID:4GWzufxp.net]
>>97
実行回数の話だったのかよww
まさかねw

104 名前:デフォルトの名無しさん mailto:sage [2022/05/18(水) 07:56:39.00 ID:HgdHe2aE.net]
>>101
フィボナッチの件はBigIntなど非Copyも対象で今回の話は全く無関係だろ
そこを区別できていないのは相当ヤバいぞ

105 名前:デフォルトの名無しさん mailto:sage [2022/05/18(水) 08:12:27.72 ID:BE/QrV8J.net]
流れからすると本当はジェネリックのフィボナッチにCopyを付けないほうが有利と主張したかったんじゃね?

でも後から回避できないことに気づいて苦しい言い訳を重ねてるだけと見た

106 名前:デフォルトの名無しさん mailto:sage [2022/05/18(水) 08:21:27.45 ID:6swlbHlO.net]
>>85
根拠も示さず批判だけする一番アカン人間やな

107 名前:デフォルトの名無しさん mailto:sage [2022/05/18(水) 08:33:04.08 ID:6hDwlDoy.net]
>>104
フィボナッチはCopyを回避できないものなの?

108 名前:デフォルトの名無しさん mailto:sage [2022/05/18(水) 08:45:43.18 ID:2HNq06l+.net]
分からないなら分からないから教えてって言えばいいのに意地を張るからこうなる
構えば構うほど意味不明な発言が出てくる

真面目に議論したいならせめてIDコロコロ変えるのやめな

109 名前:デフォルトの名無しさん mailto:sage [2022/05/18(水) 09:10:15.39 ID:Gy2qdhBc.net]
フィボナッチってこれだろ
f(0) = 0
f(1) = 1
f(n) = f(n - 1) + f(n - 2)
関数呼び出しに足し算に大量のコピーは避けられない



110 名前:デフォルトの名無しさん mailto:sage [2022/05/18(水) 09:28:25.87 ID:3vPi03ro.net]
>>87
async関数やasyncブロックで生成されるFutureは結構大きくなることがあって、boxingした方が性能出るケースもある

111 名前:デフォルトの名無しさん mailto:sage [2022/05/18(水) 10:05:07.09 ID:jV65BxdQ.net]
>>106
型制約からCopyを外すこことcopyを回避することは全く意味が違う
>>83の質問は明らかに後者

プリミティブも対象になるフィボナッチでcopyを回避するのは無理

112 名前:デフォルトの名無しさん mailto:sage [2022/05/18(水) 10:20:40.09 ID:AWXqkW+Q.net]
>>110
型制約からCopyを外せばプリミティブと言えどもcopyされなくなる
具体的には個々のプリミティブ型へモノモーフィゼーゼーションされる前の段階でCopy実装していない型に対してのcopy発生エラーが生じる
フィボナッチでcopyを回避するのは可能

113 名前:デフォルトの名無しさん mailto:sage [2022/05/18(水) 10:38:43.35 ID:2JRtSvHV.net]
複オジの主張まとめ(1)
37, 39, 44
=====
CopyやCloneを使っているから別問題だろう。
一般的にRustのプログラミングでは、
Copy(暗黙的な自動コピー)やClone(clone()による明示的な手動コピー)を使うと楽になるが、コストは高くなる。
そのため不要なclone()を見極めてそれを回避するプログラミングが出来るかどうか、というRustにおける根源的な話だろう。

もちろんCopyは最もコストが高い。
個々のコスト自体は通常clone()と同じだが、常に自動的にclone()が起きるため最もコストが高くなる。

Copyはコストが一番高いから出来る限り避けるべきだな
特にヒープを使うならCloneまでにしておくべき
可能ならばCloneも避けるべきだが

114 名前:デフォルトの名無しさん mailto:sage [2022/05/18(水) 10:39:05.95 ID:2JRtSvHV.net]
複オジの主張まとめ(2)
50, 52, 57
=====
それは理解不足すぎるぜ
大文字のCopyはCopyトレイトを意味しCopyトレイトを実装するか否かの話だろ
moveは別方向の話であり比較対象にすらならない
比較するならば「Copy実装(必然的にClone)も実装」「Cloneのみ実装」「どちらも実装なし」の3つだな

デタラメすぎ
ムーブでビットパターンのコピーは発生しない
ビットパターンのコピーが発生するのは引数の値渡し等であってムーブとは関係ない
さらに引数の値渡しでのでビットパターンのコピーとCopyのコピーも全く異なる
Copyのコピーはディープであって高コスト

これだけCopyやCloneを理解していない連中が多い状況だと
>>30の質問に答えられるかどうかは最低限クリアすべきテストとして有用ではないか?
フィボナッチ自体はもちろんどうでもよい話だがCopyやCloneを避けるRustの基本ができるかどうかわかる点で

115 名前:デフォルトの名無しさん mailto:sage [2022/05/18(水) 10:41:41.09 ID:2JRtSvHV.net]
複オジの一連の主張を読んでから>>83の複オジ質問を読むべし

116 名前:デフォルトの名無しさん mailto:sage [2022/05/18(水) 10:44:21.46 ID:Jso4/z1R.net]
複おじに反応するやつも複おじ

117 名前:デフォルトの名無しさん mailto:sage [2022/05/18(水) 10:52:26.71 ID:j9G6SOiS.net]
主張が毎回変わる
口調も毎回変わる
表記も毎回変わる
間違いなく多重人格者

118 名前:デフォルトの名無しさん [2022/05/18(水) 10:55:48.57 ID:TXrPyH7a.net]
>>98
この文脈では○○にはなんでも当てはまるから意味がないよね

以下なら議論になる?
A「copy/cloneはmoveよりコストが生じるので、copyが必要な部分とそうでない部分で構造体を分離してでも出来るだけmoveを使用する」
B「copy/cloneのコストはmoveよりコストが生じるとは限らないので、一部でもcopyが必要な部分がある構造体は丸ごとcopyして構わない」

119 名前:デフォルトの名無しさん [2022/05/18(水) 11:00:11.80 ID:TXrPyH7a.net]
>>116
そこまでいったらネット上では別人で良いだろ



120 名前:デフォルトの名無しさん mailto:sage [2022/05/18(水) 11:05:55.27 ID:f/6XNiB/.net]
>>108
やってみた

fn main() {
for n in 0..100 {
let f = f(n);
println!("f({n}) = {f}");
}
}

fn f(n: i32) -> i32 {
match n {
0 => 0,
1 => 1,
n => f(n - 1) + f(n - 2),
}
}

このあたりから非常に重くなった
f(43) = 433494437
f(44) = 701408733
f(45) = 1134903170
f(46) = 1836311903
f(47) = -1323752223
f(48) = 512559680

121 名前:デフォルトの名無しさん mailto:sage [2022/05/18(水) 11:24:29.81 ID:Rx65yaNy.net]
メモ化されてないんやから遅くなるのは当然
>>108は定義を示しただけちゃう?

122 名前:デフォルトの名無しさん mailto:sage [2022/05/18(水) 11:25:30.07 ID:Rx65yaNy.net]
つかオーバーフローしとるな

123 名前:デフォルトの名無しさん mailto:sage [2022/05/18(水) 11:29:30.10 ID:e0i+LLok.net]
>>119
そのコードだとcopyは何回くらい発生してるのだろう
0回?1回?2回?3回?たくさん?

124 名前:デフォルトの名無しさん mailto:sage [2022/05/18(水) 12:13:31 ID:QV9C5cPM.net]
ぼくのかんがえたさいきょうのcountup<T>()をみんなバカにしたので
ぼくのかんがえたさいきょうのfibonacchi<T>()でやっつけようとしたら
わざをだすまえにボコボコにやられてしまいました
く、くやしいです!

125 名前:デフォルトの名無しさん mailto:sage [2022/05/18(水) 13:41:52 ID:mX15beFi.net]
clone()が一個でコンパイル通ったからそのコードでのコピーは一回ではないか

use std::ops::{Add, Sub};
fn f<T>(n: T) -> T where T: Clone + PartialEq + TryFrom<usize> + Add<Output=T> + Sub<Output=T> {
let [zero, one, two] = [0, 1, 2].map(|n| T::try_from(n).ok().unwrap());
match n {
n if n == zero => zero,
n if n == one => one,
n => f(n.clone() - one) + f(n - two),
}
}

126 名前:デフォルトの名無しさん mailto:sage [2022/05/18(水) 13:50:00 ID:FQ8O/3lA.net]
>>119
計算量はO(n), メモリ使用量は定数オーダーにできるのになんで定義どおり実装したの?

127 名前:デフォルトの名無しさん mailto:sage [2022/05/18(水) 14:41:04.77 ID:xTux5YG/.net]
>>123
ぼくのかんがえたさいきょうのfizzbuzz<T>()もわすれないで

128 名前:デフォルトの名無しさん mailto:sage [2022/05/18(水) 15:04:45.49 ID:dI/aN4vs.net]
>>125
そんな魔法はありません

129 名前:デフォルトの名無しさん mailto:sage [2022/05/18(水) 16:48:40.40 ID:pQAvghMm.net]
>>127
え?



130 名前:デフォルトの名無しさん mailto:sage [2022/05/18(水) 17:53:48.13 ID:jsK0MVuh.net]
Rust以前の問題じゃん
スレ違い

131 名前:デフォルトの名無しさん mailto:sage [2022/05/18(水) 23:22:25.69 ID:z2ufbs5N.net]
>>124
そのclone()は子のf(n-1)とf(n-2)やそれらの子孫でも呼ばれるので1回ではなくO(n)より大きい
それをO(n)すなわちn回+定数回以下に抑えられるのかどうか
あるいはO(0)回すなわち定数回以下に抑えられるのかどうか

132 名前:デフォルトの名無しさん mailto:sage [2022/05/18(水) 23:41:48.24 ID:RLh6XGtQ.net]
フィボナッチはu128を使ってもf(187)でオーバフローするからBigInt必須
clone()はできる限り少なくしないと厳しい

133 名前:デフォルトの名無しさん mailto:sage [2022/05/19(木) 00:10:47.96 ID:SnnzWk5R.net]
どうでもいいから複おじはTRPL読み直してきてね

134 名前:デフォルトの名無しさん mailto:sage [2022/05/19(木) 00:16:28.52 ID:IEr5OW/T.net]
>>120
メモ化したら速くなったけど
memoをこちらで用意して毎回渡していくのを避けられないのかな?

fn main() {
let mut memo: Vec<usize> = Vec::new();
for n in 0..100 {
let f = f(n, &mut memo);
println!("f({n}) = {f}");
}
}

fn f(n: usize, memo: &mut Vec<usize>) -> usize {
if let Some(result) = memo.get(n) {
*result
} else {
let result = match n {
0 => 0,
1 => 1,
n => f(n - 1, memo) + f(n - 2, memo),
};
memo.push(result);
result
}
}

135 名前:デフォルトの名無しさん mailto:sage [2022/05/19(木) 00:24:17.53 ID:d4KplWCH.net]
メモ化する必要ある?
直前の2つだけ記録しておけば次の一項が計算できるんだから再帰にする必要ないよね

136 名前:デフォルトの名無しさん mailto:sage [2022/05/19(木) 00:33:12.40 ID:IEr5OW/T.net]
>>134
具体的にどうすればよいてすか?

137 名前:デフォルトの名無しさん mailto:sage [2022/05/19(木) 00:46:08.98 ID:HY3grr6d.net]
>>135
"rust fibonacci"でググるとよいです

138 名前:デフォルトの名無しさん mailto:sage [2022/05/19(木) 01:21:23 ID:f3pwm4rC.net]
>>134
直前の2つだけ記録して再帰にしない方法ならば
おそらくこうする案だと思うが
>>133がO(n)で済んでいるのに

139 名前:対して
これは二重のforによりO(n^2)になっていてこれは悪手

fn main() {
for n in 0..100 {
let f = f(n);
println!("f({n}) = {f}");
}
}

fn f(n: usize) -> usize {
match n {
0 => 0,
1 => 1,
n => {
let mut prepre = 0;
let mut pre = 1;
for i in 2..n {
let tmp = pre;
pre += prepre;
prepre = tmp;
}
pre + prepre
},
}
}
[]
[ここ壊れてます]



140 名前:デフォルトの名無しさん mailto:sage [2022/05/19(木) 01:31:14.77 ID:d4KplWCH.net]
>>135
fn main(){
for n in 0..10{
println!("f({}) = {}", n, f(n));
}
}
fn f(n:usize) -> usize{
let mut a = 0;
let mut b = 1;
for i in 0..n{
let tmp = b;
b = a + b;
a = tmp;
}
return a;
}

わざわざRustっぽい書き方をする必要はない

141 名前:デフォルトの名無しさん mailto:sage [2022/05/19(木) 01:39:04.90 ID:f3pwm4rC.net]
>>138
それもforが二重となっていて全体でO(n^2)だから同じく悪手

142 名前:デフォルトの名無しさん mailto:sage [2022/05/19(木) 02:09:27.74 ID:XQuKTBpO.net]
>>131
なら尚のことジェネリックにする意味ないよね?

143 名前:デフォルトの名無しさん mailto:sage [2022/05/19(木) 03:45:23.95 ID:jyObMdH0.net]
>>137,139
悪手ってなにをもって悪手だよ
一般項の導出は高校生でもできるレベルで、そうすればO(log(n))で求められるし、つまらん計算量改善のためだけのアルゴリズム議論はもうやめろ
これ以上計算量の話をするなら別のスレでやってくれ

144 名前:デフォルトの名無しさん mailto:sage [2022/05/19(木) 04:01:44.79 ID:f3pwm4rC.net]
>>141
mainに既にforループがある
だから個々をO(n)で求めると全体でO(n^2)となる
もし個々をO(log(n))で求めたとしても全体でO(n✕log(n))となる
一方で>>133は優れていて全体でO(n)だから圧倒的に良手

145 名前:デフォルトの名無しさん mailto:sage [2022/05/19(木) 08:08:36.85 ID:SnnzWk5R.net]
まあ(usize) -> usizeのインターフェースを持たせつつ逐次処理したければメモ化が楽だわな
Rustとは特に関係の無いアルゴリズム一般論の話だけど

146 名前:デフォルトの名無しさん mailto:sage [2022/05/19(木) 12:20:27.39 ID:TVQgVkXp.net]
なんでmainのループまで計算量に入れてるの?
今やってるのはフィボナッチ数列の計算量の話でしょ
余計なところまで話し広げてどうするの?

147 名前:デフォルトの名無しさん mailto:sage [2022/05/19(木) 12:42:29.01 ID:Y0RaHe9J.net]
いい加減こんな語り尽くされた話終わってろ
何スレだよここ

148 名前:デフォルトの名無しさん mailto:sage [2022/05/19(木) 12:44:11.02 ID:2eGzkY/T.net]
>>143
メモ化は良いが>>133のコードはインターフェースがあまりよくない
逆に>>138のコードはn個の列挙にO(n^2)も費やしている
以下のように書けばn個の列挙がO(n)に収まり、個別f(n)もO(n)で両立できる

fn main() {
println!("f(77) = {}", f(77));
for (n, f) in fibonacci_iter().enumerate() {
println!("f({n}) = {f}");
}
}

fn f(n: usize) -> usize {
fibonacci_iter().nth(n).unwrap()
}

fn fibonacci_iter() -> impl Iterator<Item=usize> {
let mut p = 0;
let mut q = 1;
std::iter::from_fn(move || {
let r = p;
p = q;
q += r;
Some(r)
})
}

149 名前:デフォルトの名無しさん mailto:sage [2022/05/19(木) 12:47:27.97 ID:wYj4kQtM.net]
僕チンすごい!ってホルホルしたいんだろうけど

脳のワーキングメモリーが減ってこの程度の内容でしかコードが書けないんだろうな



150 名前:デフォルトの名無しさん mailto:sage [2022/05/19(木) 13:06:09.75 ID:TVQgVkXp.net]
まず計算量にmainのループを勘定してる時点で…

151 名前:デフォルトの名無しさん [2022/05/19(木) 13:18:54.57 ID:u56F2Ocx.net]
>>144
> 今やってるのはフィボナッチ数列の計算量の話でしょ

その通りでアンタが正しい

>>148
フィボナッチ『数列』の計算量だから
mainのループを勘定するのは当然
f(0)、f(1)、f(2)、…、f(n)がフィボナッチ『数列』

152 名前:デフォルトの名無しさん [2022/05/19(木) 18:50:45.11 ID:j8hvvms1.net]
イテレーターにするとメリット多いんだな
Rustと相性いい

153 名前:デフォルトの名無しさん mailto:sage [2022/05/19(木) 19:01:17.07 ID:SnnzWk5R.net]
>>146はメモ捨ててるから計算済みのf(n)引っ張ってくるのに毎回O(n)かかる

154 名前:けどね
イテレータと相性良いように見えるとしたら0..nループと組み合わせることしかしてこなかったmainが見せる幻想

そろそろRustの話に戻ってもらっていいですか?
[]
[ここ壊れてます]

155 名前:デフォルトの名無しさん mailto:sage [2022/05/19(木) 19:56:30.02 ID:X9gr9ket.net]
>>151
マジで>>133のメモ化が好ましいと思っているのか?
イテレータはメモ化とも相性が良い
例えば>>146のfibonacci_iter()を含むイテレータ汎用メモ化は即席でこんな感じ

fn main() {
let mut memo = IterMemo::new(fibonacci_iter());
assert_eq!(memo.nth(10), Some(55));
assert_eq!(memo.nth(0), Some(0));
assert_eq!(memo.nth(30), Some(832040));
assert_eq!(memo.nth(5), Some(5));
assert_eq!(memo.nth(50), Some(12586269025));
}

struct IterMemo<I> {
iter: I,
memo: Vec<usize>,
}

impl<I: Iterator<Item=usize>> IterMemo<I> {
fn new(iter: I) -> Self {
IterMemo { iter, memo: Vec::new() }
}
fn nth(&mut self, n: usize) -> Option<usize> {
for _i in self.memo.len()..=n {
if let Some(x) = self.iter.next() {
self.memo.push(x);
}
}
self.memo.get(n).cloned()
}
}

156 名前:デフォルトの名無しさん mailto:sage [2022/05/19(木) 21:07:44.82 ID:wYj4kQtM.net]
汚いな

157 名前:デフォルトの名無しさん mailto:sage [2022/05/19(木) 21:11:33.57 ID:+7PnyNeM.net]
複オジは何が問題だと指摘されてるのか理解しないんだよなぁ
頭悪いのにとにかくマウントだけ取りたがって恥の上塗り上塗り上塗り
何回塗るねんっw

158 名前:デフォルトの名無しさん mailto:sage [2022/05/19(木) 21:20:54.65 ID:5LQoe3Bs.net]
ほらなw
ぼくのかんがえたさいきょうのひぼなっちいてれーた!
どや!? どやどやどや!!?
これで1000まで行くよw

159 名前:デフォルトの名無しさん mailto:sage [2022/05/19(木) 21:27:22.70 ID:SnnzWk5R.net]
どうしてもイテレータが欲しいなら>>133に建て増ししたほうがよっぽど整理されていいよ
https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=86c556a9709d959e8b9ecff08223b099



160 名前:デフォルトの名無しさん mailto:sage [2022/05/19(木) 21:29:51.14 ID:u7/IlrFk.net]
>>152
イテレータの規約に反したオレオレnth()はやめてくれ
IterMemoなんて名前の構造体にnth()が実装されてればイテレータのnth()と勘違いしてしまう

161 名前:デフォルトの名無しさん mailto:sage [2022/05/19(木) 21:34:02.60 ID:wYj4kQtM.net]
その前に単純にバグ入りだけど

162 名前:デフォルトの名無しさん mailto:sage [2022/05/19(木) 21:51:56.08 ID:MGh63lg3.net]
メモ化と個別機能が完全に分離できている>>152の方が良さげ

163 名前:デフォルトの名無しさん mailto:sage [2022/05/19(木) 21:55:11.08 ID:wYj4kQtM.net]
このスレだけでなくRust書く人間はコケ前提なのが馬鹿らしい
未知の計算するのに対策してない馬鹿野郎ども

164 名前:デフォルトの名無しさん mailto:sage [2022/05/19(木) 21:56:15.85 ID:wYj4kQtM.net]
目が覚めろ
目が覚めろ

コケ前提は恥ずかしい

165 名前:デフォルトの名無しさん mailto:sage [2022/05/19(木) 21:56:34.11 ID:iLpWQ9zs.net]
>>159
分離できてねーよw
アホだろ

イテレータ使ったことないのか?

166 名前:デフォルトの名無しさん mailto:sage [2022/05/19(木) 21:58:30.11 ID:wYj4kQtM.net]
Rust書く人間はレベルが低いと思われても平気なのか?

167 名前:デフォルトの名無しさん mailto:sage [2022/05/19(木) 22:05:28.50 ID:+v1Fmw4c.net]
>>156は普通にフィボナッチ数列を順に表示するだけでも常にVecを使ったメモ化を伴うので筋がよくない
>>152はメモ化を付け外し可能で問題点も特に無いようだが

168 名前:デフォルトの名無しさん mailto:sage [2022/05/19(木) 22:13:58.00 ID:G2OEvBhv.net]
「Rustでドヤりたい素人が犯しがちな12の過ち」
みたいな記事が捗りそう

169 名前:デフォルトの名無しさん mailto:sage [2022/05/19(木) 22:18:44.85 ID:iQApRYmM.net]
>>164
関数の設計ができない人の発想



170 名前:デフォルトの名無しさん mailto:sage [2022/05/19(木) 22:22:18.18 ID:z7fdj+fO.net]
>>164
なんでIDコロコロ変えてるの?

171 名前:デフォルトの名無しさん mailto:sage [2022/05/19(木) 22:27:10.61 ID:2ZXoSlQ2.net]
>>165
複オジ特有の妄想を一般化するなよ
「複オジがドヤ顔で晒した恥ずかしい勘違い12選」にしとけ
需要ないけどな

172 名前:デフォルトの名無しさん mailto:sage [2022/05/19(木) 22:29:47.42 ID:EaXeIbDt.net]
こんな数列ごときでヒープ必須の>>156はプログラミングが下手

173 名前:デフォルトの名無しさん mailto:sage [2022/05/19(木) 22:47:12.76 ID:AQMm07Qd.net]
数列ごときのプログラムしか書けない複製おじさん……

174 名前:デフォルトの名無しさん mailto:sage [2022/05/19(木) 23:33:01.93 ID:wYj4kQtM.net]
cargo run --releaseで予測した動きをしないコードを書くなよ
速やかにバグを取れ

175 名前:デフォルトの名無しさん mailto:sage [2022/05/19(木) 23:33:20.92 ID:vqaI/jC6.net]
Rust 1.61.0

176 名前:デフォルトの名無しさん mailto:sage [2022/05/19(木) 23:35:03.68 ID:wYj4kQtM.net]
このスレの底辺のコーダーもどき全員ゴミ
まともなコードすらかけないでiterが~とか言ってんじゃねえよ
バカども

177 名前:デフォルトの名無しさん mailto:sage [2022/05/20(金) 00:27:37 ID:xM0P3yOr.net]
拗らせくんもいるのか

178 名前:デフォルトの名無しさん mailto:sage [2022/05/20(金) 00:53:44 ID:syYn06qN.net]
このスレを見る限りRustプログラマは低レベルの人間ばかり
まともに動きもしないものでああだこうだ言いあってるだけだ

179 名前:デフォルトの名無しさん mailto:sage [2022/05/20(金) 00:53:59 ID:obugnqXb.net]
フィボナッチ数列議論スレでやれ



180 名前:デフォルトの名無しさん mailto:sage [2022/05/20(金) 00:54:42 ID:syYn06qN.net]
オーバーフローのまともな対処すら知らない馬鹿ばかり

181 名前:デフォルトの名無しさん mailto:sage [2022/05/20(金) 01:04:06 ID:syYn06qN.net]
俺が小学生の頃はBASICで整数オーバーフロー考慮したプログラムは書いていた
多倍長整数演算も自分で考案して天文計算もやっていた

このスレの連中は小学生の頃の俺に負けるレベルの奴しかいない
Rustを書く人間はその程度のレベルばかり

182 名前:デフォルトの名無しさん mailto:sage [2022/05/20(金) 01:16:05.19 ID:P7xg55cn.net]
エイリアン vs アバター

183 名前:デフォルトの名無しさん mailto:sage [2022/05/20(金) 02:33:24.77 ID:g6eOZZWy.net]
天文計算なら多倍長じゃなくて浮動小数みたいに指数部と仮数部だけ保持しておくほうがいいだろう

184 名前:デフォルトの名無しさん mailto:sage [2022/05/20(金) 07:35:06.49 ID:SXN+DpBP.net]
>>177
>>146のオーバーフロー対策をしてみた
これでいい?

fn fibonacci_iter() -> impl Iterator<Item=usize> {
let mut op: Option<usize> = Some(0);
let mut oq: Option<usize> = Some(1);
std::iter::from_fn(move || {
op.take().map(|p| {
op = oq.take().map(|q| {
oq = q.checked_add(p);
q
});
p
})
})
}

fn main() {
for (n, f) in fibonacci_iter().enumerate() {
println!("f({n}) = {f}");
}
}

185 名前:デフォルトの名無しさん mailto:sage [2022/05/20(金) 08:11:12.19 ID:YZ72zuyX.net]
必要ないOptionまで追加してtake.mapのネストは汚すぎる
事前に設計せずコンパイラ駆動だけで書くと汚いコードになりがち

186 名前:デフォルトの名無しさん mailto:sage [2022/05/20(金) 08:24:34.35 ID:5N9lui0T.net]
>>179
勝手に戦えww
複製おじさん vs 100点おじさん

187 名前:デフォルトの名無しさん mailto:sage [2022/05/20(金) 08:33:57.56 ID:7pe7/3hl.net]
>>168
1レスで晒したこの4つの無知は外せないww

(1) ムーブでビットパターンのコピーは発生しない -> ムーブ無知
(2) ビットパターンのコピーが発生するのは引数の値渡し等であってムーブとは関係ない -> 値渡し無知
(3)さらに引数の値渡しでのでビットパターンのコピーとCopyのコピーも全く異なる -> Copy無知
(4)Copyのコピーはディープであって高コスト -> ディープコピー無知

188 名前:デフォルトの名無しさん mailto:sage [2022/05/20(金) 08:44:11.52 ID:SXN+DpBP.net]
>>182
フラグは必要
それをOptionで簡潔に表現した
批判したいならば代替コードを出すべき

189 名前:デフォルトの名無しさん mailto:sage [2022/05/20(金) 08:52:03.20 ID:Te9amNUZ.net]
フィボナッチ数列を他の計算の入力として使わないのなら何番目まで必要なのかをusizeとかで受け取ってBigUintのイテレータ返すので十分かな



190 名前:デフォルトの名無しさん mailto:sage [2022/05/20(金) 08:54:16.47 ID:Te9amNUZ.net]
うげ
俺が出したのは>>185の言う代替案じゃないから
勘違いしそうだから念のため

191 名前:デフォルトの名無しさん mailto:sage [2022/05/20(金) 09:01:03.34 ID:SXN+DpBP.net]
>>186
うん
今回はオーバーフローの対処をしろと言う>>177のリクエストに応じたのみ

192 名前:デフォルトの名無しさん mailto:sage [2022/05/20(金) 09:03:09.77 ID:SXN+DpBP.net]
>>182
mapのネストが苦手と言うならば
mapを使わないバージョンも用意したのでどうぞ

fn fibonacci_iter() -> impl Iterator<Item=usize> {
let mut op: Option<usize> = Some(0);
let mut oq: Option<usize> = Some(1);
std::iter::from_fn(move || {
let p = op.take()?;
op = (|| {
let q = oq.take()?;
oq = q.checked_add(p);
Some(q)
})();
Some(p)
})
}

193 名前:デフォルトの名無しさん mailto:sage [2022/05/20(金) 09:18:53.35 ID:qCLhnuk6.net]
firefoxってどのへんにrust使ってるんだっけ

194 名前:デフォルトの名無しさん mailto:sage [2022/05/20(金) 10:35:37.22 ID:t0eTe6yv.net]
>>189
さらに汚くしてどうすんのw

195 名前:デフォルトの名無しさん mailto:sage [2022/05/20(金) 10:55:09.60 ID:SXN+DpBP.net]
>>191
汚いと言うならば同じ動作をするもっと美しいコードを出そう
「汚い」と言う人はいつもコードを出せない人だから負け惜しみで言っているのかと

196 名前:デフォルトの名無しさん mailto:sage [2022/05/20(金) 10:59:18.09 ID:6DrTvbrK.net]
>>185
unfold使ってた時と同じでフラグという捉え方がコードが汚くなる原因
命名を疎かにせず変数や関数の型を考えよう
そうすればOptionが必要なものと不要なものくらいは区別できるはず
ヒント終わり


コンパイルができた動けばいいだけのコードからは早めに卒業しようね

197 名前:デフォルトの名無しさん mailto:sage [2022/05/20(金) 11:03:32.49 ID:WF81UNfB.net]
>>192
君のコードを汚いという人間は一人や二人ではないだろう?
それがなぜなのか?
なぜ汚いと言われるのか?
自分で考えて足掻いてこそ成長するんだよ

198 名前:デフォルトの名無しさん mailto:sage [2022/05/20(金) 11:08:36.62 ID:5NF4cE9g.net]
>>192
ちなみに汚いコードの反対は汚くないコード
美しいコードである必要はない
実践で重要なのは美しいコードよりも汚くないコードを書くこと

199 名前:デフォルトの名無しさん mailto:sage [2022/05/20(金) 11:16:04.61 ID:SXN+DpBP.net]
>>193
有無を表現することが必要だからOptionを使うのが最適
Optionを使わずに書けるのならばコードを出そう

>>194
今まで言われたことない
今回言われたから、いつも汚いを連呼しているがコードを出せないダメな人かなと
反論があるならばコードで示そう



200 名前:デフォルトの名無しさん mailto:sage [2022/05/20(金) 11:26:17.74 ID:SXN+DpBP.net]
>>195
その通りだよ
だから汚くなく、簡素でわかりやすく、無駄をせずに効率も良いコードを>>189に出した
同じ動作と同じ効率でもっと簡素に書けるのならばコードを出してごらん

201 名前:デフォルトの名無しさん mailto:sage [2022/05/20(金) 11:47:37.20 ID:hTlaNj/P.net]
ベンチも取らずに効率とな?






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<296KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef