Rust part15 ..
[2ch|▼Menu]
86:デフォルトの名無しさん
22/05/17 23:40:20.70 XaJZCLYj.net
>>83
>A「copy/cloneはコストが生じるので、回避できるならば回避したほうが有利」
何と比べてコストが生じると言ってるの?
回避した場合は何で代用するつもりなの?

87:デフォルトの名無しさん
22/05/17 23:43:19.03 nlEgMvZ6.net
考えてみたけどmove/copyが問題になるレベルの大きさの型をスタックに置いて扱ったことが無いな…
使うとすれば固定長配列のバッファ?
でもそんなものmove/copyするわけないし
やっぱり考える意味の無い二択だと思う

88:デフォルトの名無しさん
22/05/17 23:47:41.13 FqAlYuq2.net
>>86
回避する前と回避した後の比較だろう
回避したコードが書けたならばcopyの代用の必要はない

89:デフォルトの名無しさん
22/05/17 23:49:36.53 YviCLBk+.net
>>83
一般的にはAが正しい
ただし>>84が言うように無駄なコピーが消える場合もある
A「copy/cloneはコストが生じるので、回避できるならば回避したほうが有利になることがある」ならば


90:ウ確 Bについては前半はある意味正しいとしても後半が間違い >>85 批判や主張はその理由を伴わないと議論とならず意味がない



91:デフォルトの名無しさん
22/05/17 23:54:01.76 VUKzLr9a.net
>>89
> 批判や主張はその理由を伴わないと議論とならず意味がない
基本的にはそうだが、こっちが説明しても理解できるレベルに達してない場合にはどうせ議論にならんのでな。

92:デフォルトの名無しさん
22/05/17 23:55:13.39 tAEVG8cC.net
あっこの流れC++相談室で見たやつだ

93:デフォルトの名無しさん
22/05/18 00:07:06.58 P5Km+xQv.net
要は参照使えるなら使っとけって?
今更すぎませんか

94:デフォルトの名無しさん
22/05/18 00:30:37.66 DGffctwq.net
オナコードペタペタされてたほうがマシだったなこりゃ

95:デフォルトの名無しさん
22/05/18 00:45:17.78 opn2S8Zb.net
>>92
それもあるが、例えば多数のコピーが行われているコードに対して、回避できる分を見直し、少数のコピーで済むように改善できる場合もある
Copy実装せずに明示clone()した方が見つけやすいかもしれない

96:デフォルトの名無しさん
22/05/18 01:26:17.77 lxQ5l4ey.net
>>88
さすがに意味が分からないよ
値の受け渡しにcopyを使わないなら何が他の方法を使う必要があるでしょ

97:デフォルトの名無しさん
22/05/18 01:42:43.25 d5NnfCmB.net
一人だけ間違った思い込みをしてるのに
説明されても「俺は間違ってない、間違ってるのはお前ら」が続くだけだからな

98:デフォルトの名無しさん
22/05/18 01:46:16.75 6ezlEFaX.net
>>95
頭が硬すぎないか?
回避できる分を回避するだけだろ
回避できない分まで回避する、と思い込んてるのはYouのみ

99:デフォルトの名無しさん
22/05/18 01:51:55.82 Da/MVUm8.net
>>89
「○○はコストが生じるので、回避できるならば回避したほうが有利になることがある」
言葉の定義を明確にしないジェネリック文は
恣意的に常に真にも常に偽にもできる

100:デフォルトの名無しさん
22/05/18 02:06:14.30 UgigdTUo.net
>>90
無駄にプライド高いな
嫌われるぜ

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

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

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

103:デフォルトの名無しさん
22/05/18 07:41:25.51 4GWzufxp.net
>>97
実行回数の話だったのかよww
まさかねw

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

105:デフォルトの名無しさん
22/05/18 08:12:27.72 BE/QrV8J.net
流れからすると本当はジェネリックのフィボナッチにCopyを付けないほうが有利と主張したかったんじゃね?
でも後から回避できないことに気づいて苦しい言い訳を重ねてるだけと見た

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

107:デフォルトの名無しさん
22/05/18 08:33:04.08 6hDwlDoy.net
>>104
フィボナッチはCopyを回避できないものなの?

108:デフォルトの名無しさん
22/05/18 08:45:43.18 2HNq06l+.net
分からないなら分からないから教えてって言えばいいのに意地を張るからこうなる
構えば構うほど意味不明な発言が出てくる
真面目に議論したいならせめてIDコロコロ変えるのやめな

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

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

111:デフォルトの名無しさん
22/05/18 10:05:07.09 jV65BxdQ.net
>>106
型制約からCopyを外すこことcopyを回避することは全く意味が違う
>>83の質問は明らかに後者
プリミティブも対象になるフィボナッチでcopyを回避するのは無理

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

113:デフォルトの名無しさん
22/05/18 10:38:43.35 2JRtSvHV.net
複オジの主張まとめ(1)
37, 39, 44
=====
CopyやCloneを使っているから別問題だろう。
一般的にRustのプログラミングでは、
Copy(暗黙的な自動コピー)やClone(clone()による明示的な手動コピー)を使うと楽になるが、コストは高くなる。
そのため不要なclone()を見極めてそれを回避するプログラミングが出来るかどうか、というRustにおける根源的な話だろう。
もちろんCopyは最もコストが高い。
個々のコスト自体は通常clone()と同じだが、常に自動的にclone()が起きるため最もコストが高くなる。
Copyはコストが一番高いから出来る限り避けるべきだな
特にヒープを使うならCloneまでにしておくべき
可能ならばCloneも避けるべきだが

114:デフォルトの名無しさん
22/05/18 10:39:05.95 2JRtSvHV.net
複オジの主張まとめ(2)
50, 52, 57
=====
それは理解不足すぎるぜ
大文字のCopyはCopyトレイトを意味しCopyトレイトを実装するか否かの話だろ
moveは別方向の話であり比較対象にすらならない
比較するならば「Copy実装(必然的にClone)も実装」「Cloneのみ実装」「どちらも実装なし」の3つだな
デタラメすぎ
ムーブでビットパターンのコピーは発生しない
ビットパターンのコピーが発生するのは引数の値渡し等であってムーブとは関係ない
さらに引数の値渡しでのでビットパターンのコピーとCopyのコピーも全く異なる
Copyのコピーはディープであって高コスト
これだけCopyやCloneを理解していない連中が多い状況だと
>>30の質問に答えられるかどうかは最低限クリアすべきテストとして有用ではないか?
フィボナッチ自体はもちろんどうでもよい話だがCopyやCloneを避けるRustの基本ができるかどうかわかる点で

115:デフォルトの名無しさん
22/05/18 10:41:41.09 2JRtSvHV.net
複オジの一連の主張を読んでから>>83の複オジ質問を読むべし

116:デフォルトの名無しさん
22/05/18 10:44:21.46 Jso4/z1R.net
複おじに反応するやつも複おじ

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

118:デフォルトの名無しさん
22/05/18 10:55:48.57 TXrPyH7a.net
>>98
この文脈では○○にはなんでも当てはまるから意味がないよね
以下なら議論になる?
A「copy/cloneはmoveよりコストが生じるので、copyが必要な部分とそうでない部分で構造体を分離してでも出来るだけmoveを使用する」
B「copy/cloneのコストはmoveよりコストが生じるとは限らないので、一部でもcopyが必要な部分がある構造体は丸ごとcopyして構わない」

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

120:デフォルトの名無しさん
22/05/18 11:05:55.27 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:デフォルトの名無しさん
22/05/18 11:24:29.81 Rx65yaNy.net
メモ化されてないんやから遅くなるのは当然
>>108は定義を示しただけちゃう?

122:デフォルトの名無しさん
22/05/18 11:25:30.07 Rx65yaNy.net
つかオーバーフローしとるな

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

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

125:デフォルトの名無しさん
22/05/18 13:41:52 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:デフォルトの名無しさん
22/05/18 13:50:00 FQ8O/3lA.net
>>119
計算量はO(n), メモリ使用量は定数オーダーにできるのになんで定義どおり実装したの?

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

128:デフォルトの名無しさん
22/05/18 15:04:45.49 dI/aN4vs.net
>>125
そんな魔法はありません

129:デフォルトの名無しさん
22/05/18 16:48:40.40 pQAvghMm.net
>>127
え?

130:デフォルトの名無しさん
22/05/18 17:53:48.13 jsK0MVuh.net
Rust以前の問題じゃん
スレ違い

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

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

133:デフォルトの名無しさん
22/05/19 00:10:47.96 SnnzWk5R.net
どうでもいいから複おじはTRPL読み直してきてね

134:デフォルトの名無しさん
22/05/19 00:16:28.52 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:デフォルトの名無しさん
22/05/19 00:24:17.53 d4KplWCH.net
メモ化する必要ある?
直前の2つだけ記録しておけば次の一項が計算できるんだから再帰にする必要ないよね

136:デフォルトの名無しさん
22/05/19 00:33:12.40 IEr5OW/T.net
>>134
具体的にどうすればよいてすか?

137:デフォルトの名無しさん
22/05/19 00:46:08.98 HY3grr6d.net
>>135
"rust fibonacci"でググるとよいです

138:デフォルトの名無しさん
22/05/19 01:21:23 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:デフォルトの名無しさん
22/05/19 01:31:14.77 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:デフォルトの名無しさん
22/05/19 01:39:04.90 f3pwm4rC.net
>>138
それもforが二重となっていて全体でO(n^2)だから同じく悪手

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

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

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

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

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

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

148:デフォルトの名無しさん
22/05/19 12:44:11.02 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:デフォルトの名無しさん
22/05/19 12:47:27.97 wYj4kQtM.net
僕チンすごい!ってホルホルしたいんだろうけど
脳のワーキングメモリーが減ってこの程度の内容でしかコードが書けないんだろうな

150:デフォルトの名無しさん
22/05/19 13:06:09.75 TVQgVkXp.net
まず計算量にmainのループを勘定してる時点で…

151:デフォルトの名無しさん
22/05/19 13:18:54.57 u56F2Ocx.net
>>144
> 今やってるのはフィボナッチ数列の計算量の話でしょ
その通りでアンタが正しい
>>148
フィボナッチ『数列』の計算量だから
mainのループを勘定するのは当然
f(0)、f(1)、f(2)、…、f(n)がフィボナッチ『数列』

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

153:デフォルトの名無しさん
22/05/19 19:01:17.07 SnnzWk5R.net
>>146はメモ捨ててるから計算済みのf(n)引っ張ってくるのに毎回O(n)かかるけどね
イテレータと相性良いように見えるとしたら0..nループと組み合わせることしかしてこなかったmainが見せる幻想
そろそろRustの話に戻ってもらっていいですか?

154:デフォルトの名無しさん
22/05/19 19:56:30.02 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()
}
}

155:デフォルトの名無しさん
22/05/19 21:07:44.82 wYj4kQtM.net
汚いな

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

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

158:デフォルトの名無しさん
22/05/19 21:27:22.70 SnnzWk5R.net
どうしてもイテレータが欲しいなら>>133に建て増ししたほうがよっぽど整理されていいよ
URLリンク(play.rust-lang.org)

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

160:デフォルトの名無しさん
22/05/19 21:34:02.60 wYj4kQtM.net
その前に単純にバグ入りだけど

161:デフォルトの名無しさん
22/05/19 21:51:56.08 MGh63lg3.net
メモ化と個別機能が完全に分離できている>>152の方が良さげ

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

163:デフォルトの名無しさん
22/05/19 21:56:15.85 wYj4kQtM.net
目が覚めろ
目が覚めろ
コケ前提は恥ずかしい

164:デフォルトの名無しさん
22/05/19 21:56:34.11 iLpWQ9zs.net
>>159
分離できてねーよw
アホだろ
イテレータ使ったことないのか?

165:デフォルトの名無しさん
22/05/19 21:58:30.11 wYj4kQtM.net
Rust書く人間はレベルが低いと思われても平気なのか?

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

167:デフォルトの名無しさん
22/05/19 22:13:58.00 G2OEvBhv.net
「Rustでドヤりたい素人が犯しがちな12の過ち」
みたいな記事が捗りそう

168:デフォルトの名無しさん
22/05/19 22:18:44.85 iQApRYmM.net
>>164
関数の設計ができない人の発想

169:デフォルトの名無しさん
22/05/19 22:22:18.18 z7fdj+fO.net
>>164
なんでIDコロコロ変えてるの?

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

171:デフォルトの名無しさん
22/05/19 22:29:47.42 EaXeIbDt.net
こんな数列ごときでヒープ必須の>>156はプログラミングが下手

172:デフォルトの名無しさん
22/05/19 22:47:12.76 AQMm07Qd.net
数列ごときのプログラムしか書けない複製おじさん……

173:デフォルトの名無しさん
22/05/19 23:33:01.93 wYj4kQtM.net
cargo run --releaseで予測した動きをしないコードを書くなよ
速やかにバグを取れ

174:デフォルトの名無しさん
22/05/19 23:33:20.92 vqaI/jC6.net
Rust 1.61.0

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

176:デフォルトの名無しさん
22/05/20 00:27:37 xM0P3yOr.net
拗らせくんもいるのか

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

178:デフォルトの名無しさん
22/05/20 00:53:59 obugnqXb.net
フィボナッチ数列議論スレでやれ

179:デフォルトの名無しさん
22/05/20 00:54:42 syYn06qN.net
オーバーフローのまともな対処すら知らない馬鹿ばかり

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

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

181:デフォルトの名無しさん
22/05/20 01:16:05.19 P7xg55cn.net
エイリアン vs アバター

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

183:デフォルトの名無しさん
22/05/20 07:35:06.49 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}");
}
}

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

185:デフォルトの名無しさん
22/05/20 08:24:34.35 5N9lui0T.net
>>179
勝手に戦えww
複製おじさん vs 100点おじさん

186:デフォルトの名無しさん
22/05/20 08:33:57.56 7pe7/3hl.net
>>168
1レスで晒したこの4つの無知は外せないww
(1) ムーブでビットパターンのコピーは発生しない -> ムーブ無知
(2) ビットパターンのコピーが発生するのは引数の値渡し等であってムーブとは関係ない -> 値渡し無知
(3)さらに引数の値渡しでのでビットパターンのコピーとCopyのコピーも全く異なる -> Copy無知
(4)Copyのコピーはディープであって高コスト -> ディープコピー無知

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

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

189:デフォルトの名無しさん
22/05/20 08:54:16.47 Te9amNUZ.net
うげ
俺が出したのは>>185の言う代替案じゃないから
勘違いしそうだから念のため

190:デフォルトの名無しさん
22/05/20 09:01:03.34 SXN+DpBP.net
>>186
うん
今回はオーバーフローの対処をしろと言う>>177のリクエストに応じたのみ

191:デフォルトの名無しさん
22/05/20 09:03:09.77 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)
})
}

192:デフォルトの名無しさん
22/05/20 09:18:53.35 qCLhnuk6.net
firefoxってどのへんにrust使ってるんだっけ

193:デフォルトの名無しさん
22/05/20 10:35:37.22 t0eTe6yv.net
>>189
さらに汚くしてどうすんのw

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

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

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

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

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

198:デフォルトの名無しさん
22/05/20 11:16:04.61 SXN+DpBP.net
>>193
有無を表現することが必要だからOptionを使うのが最適
Optionを使わずに書けるのならばコードを出そう
>>194
今まで言われたことない
今回言われたから、いつも汚いを連呼しているがコードを出せないダメな人かなと
反論があるならばコードで示そう

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

200:デフォルトの名無しさん
22/05/20 11:47:37.20 hTlaNj/P.net
ベンチも取らずに効率とな?

201:デフォルトの名無しさん
22/05/20 11:48:38.99 50J2u53j.net
>>184
その4つは全部並んでたからインパクト強いけど
個々で見るとムーブや値渡しの間違った理解は複オジ特有じゃないからちょっと弱いな

202:デフォルトの名無しさん
22/05/20 12:16:58.58 lLMUMPSU.net
>>196
>今まで言われたことない
すごーいwww
お薬必要ですね

203:デフォルトの名無しさん
22/05/20 12:28:38.69 pMSjr2Vl.net
後出しでどんどん条件が変わっていくから話がまとまる訳がない
これ以上続けたいならソース貼るときは前提条件を共有した上でコンパクトに議論を終わらせてくれ

204:デフォルトの名無しさん
22/05/20 19:05:29.84 eTvpznuT.net
複オジは断念したみたいだから
俺の考える汚くないコードを参考までに貼っとく
URLリンク(play.rust-lang.org)

205:デフォルトの名無しさん
22/05/20 19:24:47 P7xg55cn.net
まずイテレータやめろや

206:デフォルトの名無しさん
22/05/20 19:37:01 0DaneQt4.net
 
 __     __  ___ _____  _____     ___ ___    ___
 |   |    /  /  |  //       | /__  __/ [][] _| |_| |__ _| |_
 |   |.   /  /  /  / /   / ̄ ̄|. l    / /     |    _  | |_  レ'~ ̄|
 |   |  /  /  /  / /   /.  / /    |  |___      ̄|  | / / /   /| |
 |   |  /  /  /  / /    ̄ ̄ /     \__|     |  |  ̄ /_  /  | |_
 |   |. /  /  /  / /   / ̄ ̄ ̄                |_|     |__|   \/
 |   |/  /  /  /. /   /  
 |.     /  /  /  /   / 
 |    /. /   | ./   /  
  ̄ ̄ ̄   ̄ ̄ ̄.  ̄ ̄ 

207:デフォルトの名無しさん
22/05/20 21:06:57.55 /0md/MJf.net
tauriどうよ

208:デフォルトの名無しさん
22/05/20 21:13:38.21 zMcvGPNW.net
>>202
successorsバージョンはシンプルでいいね

209:デフォルトの名無しさん
22/05/20 21:27:07.51 P7xg55cn.net
>>190
URLリンク(wiki.mozilla.org)
話題になったServo関連はもちろんとして、他は文字エンコーディングとか言語関連での採用が多いみたいね
URLリンク(4e6.github.io)
行数ではGecko全体の10%程度

210:デフォルトの名無しさん
22/05/20 21:57:08.66 j6iPiVjl.net
RustとC++を学ぼうと思ってるプログラミング初心者です。
両方ともそのうち学ぶとして、どっちを先にした方がいい感じですか?

211:デフォルトの名無しさん
22/05/20 21:59:12.98 j6iPiVjl.net
あ、スレチだったかも...すみません

212:デフォルトの名無しさん
22/05/20 22:06:04.12 j6iPiVjl.net
連投すみません...
C++ vs Rustのスレ終わってたから一応どっちにすべきかここで聞きたい
ちなみに自分の中では
・C++のほうがほんの少しだけ速い
・Rustのほうが書くのとかメモリとか楽
・C++のほうが実行環境とか充実してる
みたいな認識になってます。よろしくお願いします

213:デフォルトの名無しさん
22/05/20 23:40:49.05 1Ryh5lzf.net
>>207
ほー
ありがとう

214:デフォルトの名無しさん
22/05/21 00:10:36.10 gcU5DXZF.net
>>210
どういう領域のプログラムを作りたいかでどっちが適してるか変わるからもうちょっと学ぶ背景とか教えて

215:デフォルトの名無しさん
22/05/21 01:38:57.59 qnjM1Lxc.net
>>210
仕事で使うほう

216:デフォルトの名無しさん
22/05/21 01:45:27.47 7bviEaCH.net
なんのために学ぶのかにもよるけど、なんにせよC言語とJavaScriptはエンジニアなら全員勉強すべき
急いでないなら、そのあとでC++とRustを選んでもいい

217:デフォルトの名無しさん
22/05/21 01:46:40.74 t6WWJYF7.net
まぁC言語だよな

218:デフォルトの名無しさん
22/05/21 01:58:05.82 y9SWDgH5.net
せっかくRustのスレに来たんだしRustをやりなよ
C++をかじるのはいいけど仕事で使うわけでないなら
じゃじゃ馬を飼い馴らすバッドノウハウを今更学ぶ必要はないよ

219:デフォルトの名無しさん
22/05/21 07:32:51.54 yS5lPrM7.net
回答ありがとうございます…
とりあえずRustにしておこうと思います

220:デフォルトの名無しさん
22/05/21 09:16:08.98 iurUdiXY.net
>>217
Rustの入門書をぱらぱらと何冊か見たけど計算の優先順位の話とか普通のプログラム入門は全く書かれてないよね
C++の方は確実に書かれてる
入門はCやC++の方がいいと思うよ

221:デフォルトの名無しさん
22/05/21 09:22:23.20 iurUdiXY.net
個人的にRust以外にやったほうがいいと思う言語
C C++(深入りしない) java
多分必用になる(と思われる)言語
javascript python

222:デフォルトの名無しさん
22/05/21 09:40:03.63 wAUuWoIP.net
Cをざっと学んでからRustかな
C++は(深入りしない)が重要なんだけど、初心者が自分で判断するのは厳しい
既存の資料もC++98から20まで玉石混交という感じだし

223:デフォルトの名無しさん
22/05/21 09:44:15.57 iurUdiXY.net
自分はOOPは学んだほうがいいと思う派なのでRustだけでは不十分だと感じる
絶対業務で必要になるし
C++ java C# 学んだほうがいいと思う

224:デフォルトの名無しさん
22/05/21 10:11:16 gcU5DXZF.net
いろんなパラダイムの言語を触るのが良いよ

225:デフォルトの名無しさん
22/05/21 10:19:06 5oK/i29u.net
Rustを学ぶならばほとんどの分野でC++とJavaは不要
C言語は実用とは別に最初に基礎教養として学んでおいたほうがRustの理解が早い
C→Rustも可能だが、その前にスクリプト言語などでオブジェクト指向(のうちインスタンスとメソッド呼び出し等)と、非同期(async/await)をそれぞれ学んでおくと楽だと思う
その場合のスクリプト言語はJavaScript(ただしHTML/CSSに踏み込まなくて済むNode.js)がオススメかな

226:はちみつ餃子
22/05/21 10:46:13.19 JD6rd3hb.net
単に習得するためなら Rust を学ぶために他の言語を先に知っておく必要はないが、
C++ を先に使っていると Rust の「ありがたみ」に納得しやすいという意見はあるみたいだね。
まあ C が基礎教養であるというのは私も同意。

227:デフォルトの名無しさん
22/05/21 10:50:44.47 iurUdiXY.net
Rustだけを学ぼうとしてもその環境が整ってないんですよ
さっきも書いたけど入門書に演算子の優先順位とかそのレベルの話がどこにも書かれてない
他の言語に乗っかって入門するしかない

228:デフォルトの名無しさん
22/05/21 10:59:08.26 5oK/i29u.net
>>224
C++は不要
Cを習得しておけばRustのありがたみがわかる

229:デフォルトの名無しさん
22/05/21 11:34:26.44 jUaeJjgy.net
>>225
演算子の優先順位の話はオライリー本には書いてあるよ
プログラミングを初めて学ぶ人間がRustから始めるべきじゃないというのは完全同意だけど

230:デフォルトの名無しさん
22/05/21 11:47:35.41 vC8/2hE9.net
ぼくはガベージコレクションが嫌いです

231:デフォルトの名無しさん
22/05/21 11:50:19.62 KkLFGMWv.net
オライリー本もヒープとかスタックとか出てくるあたり、CやC++で動的メモリ確保の面倒くささを知ってる人向けだと思う

232:デフォルトの名無しさん
22/05/21 11:50:43.88 uR6sIAw1.net
メモリ管理まわりの勉強はcで必須

233:デフォルトの名無しさん
22/05/21 11:56:37.53 5oK/i29u.net
逆に考えよう
C→Rustと進むだけで十分であり、何か困ることある?
困ることないよな

234:デフォルトの名無しさん
22/05/21 12:04:35.32 CYzzzsUy.net
ゴミ集めてどうするんだっていう。

235:デフォルトの名無しさん
22/05/21 12:06:48.99 gyqhSlT2.net
十分かどうかはさておき
そもそもCをすべきかどうかというと微妙かもしれない
Cしかやってなさそうな人特有の
・変数がたくさんとっちらかった
・変数名が暗号めいてて
・ifやforが多重になってて
・グローバル変数を平気で使っちゃってる
コードみたことあるでしょ
それはそうするしかやり方を知らないから
一方、抽象度の高い言語からやった人は先にそっちに慣れるんで
List(8, 9, 3, 1).sorted.reverse.foreach(print)
こういうふうにスッキリ書けるのを目指してくれる

236:デフォルトの名無しさん
22/05/21 12:09:45.76 0tb1eDc3.net
オブジェクト指向がいちばん大事

237:デフォルトの名無しさん
22/05/21 12:10:08.62 Uoz2jgaJ.net
格下相手の話だけイキイキするな

238:デフォルトの名無しさん
22/05/21 12:12:07.01 5oK/i29u.net
>>233
それは同感で非常に重要
だから最初に>>223でCとJavaScriptを先に学ぶのをオススメと書いた

239:デフォルトの名無しさん
22/05/21 12:39:26.68 5HpZ3As+.net
ありがたみなんて知る必要ないでしょ
典型的な老害だな

240:デフォルトの名無しさん
22/05/21 12:39:58.62 0jWT+RR4.net
>>221
C++ と java はやったけど C# 必要ですか?

241:デフォルトの名無しさん
22/05/21 13:06:24.69 dZzrxVLl.net
Rustは、プログラミング経験者向けの情報が多い気がするから、PythonとかJavascript辺りをサラッと試してからでも良い気はする。
コンパイルとはとか、型って何?とか。


次ページ
最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

24日前に更新/296 KB
担当:undef