Rust part15

■ このスレッドは過去ログ倉庫に格納されています
2022/05/12(木) 18:28:20.99ID:cuIcFT6k
公式
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/
2022/05/19(木) 19:01:17.07ID:SnnzWk5R
>>146はメモ捨ててるから計算済みのf(n)引っ張ってくるのに毎回O(n)かかるけどね
イテレータと相性良いように見えるとしたら0..nループと組み合わせることしかしてこなかったmainが見せる幻想

そろそろRustの話に戻ってもらっていいですか?
2022/05/19(木) 19:56:30.02ID:X9gr9ket
>>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()
}
}
2022/05/19(木) 21:07:44.82ID:wYj4kQtM
汚いな
2022/05/19(木) 21:11:33.57ID:+7PnyNeM
複オジは何が問題だと指摘されてるのか理解しないんだよなぁ
頭悪いのにとにかくマウントだけ取りたがって恥の上塗り上塗り上塗り
何回塗るねんっw
2022/05/19(木) 21:20:54.65ID:5LQoe3Bs
ほらなw
ぼくのかんがえたさいきょうのひぼなっちいてれーた!
どや!? どやどやどや!!?
これで1000まで行くよw
2022/05/19(木) 21:27:22.70ID:SnnzWk5R
どうしてもイテレータが欲しいなら>>133に建て増ししたほうがよっぽど整理されていいよ
https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=86c556a9709d959e8b9ecff08223b099
2022/05/19(木) 21:29:51.14ID:u7/IlrFk
>>152
イテレータの規約に反したオレオレnth()はやめてくれ
IterMemoなんて名前の構造体にnth()が実装されてればイテレータのnth()と勘違いしてしまう
2022/05/19(木) 21:34:02.60ID:wYj4kQtM
その前に単純にバグ入りだけど
2022/05/19(木) 21:51:56.08ID:MGh63lg3
メモ化と個別機能が完全に分離できている>>152の方が良さげ
2022/05/19(木) 21:55:11.08ID:wYj4kQtM
このスレだけでなくRust書く人間はコケ前提なのが馬鹿らしい
未知の計算するのに対策してない馬鹿野郎ども
2022/05/19(木) 21:56:15.85ID:wYj4kQtM
目が覚めろ
目が覚めろ

コケ前提は恥ずかしい
2022/05/19(木) 21:56:34.11ID:iLpWQ9zs
>>159
分離できてねーよw
アホだろ

イテレータ使ったことないのか?
2022/05/19(木) 21:58:30.11ID:wYj4kQtM
Rust書く人間はレベルが低いと思われても平気なのか?
2022/05/19(木) 22:05:28.50ID:+v1Fmw4c
>>156は普通にフィボナッチ数列を順に表示するだけでも常にVecを使ったメモ化を伴うので筋がよくない
>>152はメモ化を付け外し可能で問題点も特に無いようだが
2022/05/19(木) 22:13:58.00ID:G2OEvBhv
「Rustでドヤりたい素人が犯しがちな12の過ち」
みたいな記事が捗りそう
2022/05/19(木) 22:18:44.85ID:iQApRYmM
>>164
関数の設計ができない人の発想
2022/05/19(木) 22:22:18.18ID:z7fdj+fO
>>164
なんでIDコロコロ変えてるの?
2022/05/19(木) 22:27:10.61ID:2ZXoSlQ2
>>165
複オジ特有の妄想を一般化するなよ
「複オジがドヤ顔で晒した恥ずかしい勘違い12選」にしとけ
需要ないけどな
2022/05/19(木) 22:29:47.42ID:EaXeIbDt
こんな数列ごときでヒープ必須の>>156はプログラミングが下手
2022/05/19(木) 22:47:12.76ID:AQMm07Qd
数列ごときのプログラムしか書けない複製おじさん……
2022/05/19(木) 23:33:01.93ID:wYj4kQtM
cargo run --releaseで予測した動きをしないコードを書くなよ
速やかにバグを取れ
2022/05/19(木) 23:33:20.92ID:vqaI/jC6
Rust 1.61.0
2022/05/19(木) 23:35:03.68ID:wYj4kQtM
このスレの底辺のコーダーもどき全員ゴミ
まともなコードすらかけないでiterが~とか言ってんじゃねえよ
バカども
2022/05/20(金) 00:27:37.05ID:xM0P3yOr
拗らせくんもいるのか
2022/05/20(金) 00:53:44.89ID:syYn06qN
このスレを見る限りRustプログラマは低レベルの人間ばかり
まともに動きもしないものでああだこうだ言いあってるだけだ
2022/05/20(金) 00:53:59.48ID:obugnqXb
フィボナッチ数列議論スレでやれ
2022/05/20(金) 00:54:42.82ID:syYn06qN
オーバーフローのまともな対処すら知らない馬鹿ばかり
2022/05/20(金) 01:04:06.18ID:syYn06qN
俺が小学生の頃はBASICで整数オーバーフロー考慮したプログラムは書いていた
多倍長整数演算も自分で考案して天文計算もやっていた

このスレの連中は小学生の頃の俺に負けるレベルの奴しかいない
Rustを書く人間はその程度のレベルばかり
2022/05/20(金) 01:16:05.19ID:P7xg55cn
エイリアン vs アバター
2022/05/20(金) 02:33:24.77ID:g6eOZZWy
天文計算なら多倍長じゃなくて浮動小数みたいに指数部と仮数部だけ保持しておくほうがいいだろう
2022/05/20(金) 07:35:06.49ID:SXN+DpBP
>>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}");
}
}
2022/05/20(金) 08:11:12.19ID:YZ72zuyX
必要ないOptionまで追加してtake.mapのネストは汚すぎる
事前に設計せずコンパイラ駆動だけで書くと汚いコードになりがち
2022/05/20(金) 08:24:34.35ID:5N9lui0T
>>179
勝手に戦えww
複製おじさん vs 100点おじさん
2022/05/20(金) 08:33:57.56ID:7pe7/3hl
>>168
1レスで晒したこの4つの無知は外せないww

(1) ムーブでビットパターンのコピーは発生しない -> ムーブ無知
(2) ビットパターンのコピーが発生するのは引数の値渡し等であってムーブとは関係ない -> 値渡し無知
(3)さらに引数の値渡しでのでビットパターンのコピーとCopyのコピーも全く異なる -> Copy無知
(4)Copyのコピーはディープであって高コスト -> ディープコピー無知
2022/05/20(金) 08:44:11.52ID:SXN+DpBP
>>182
フラグは必要
それをOptionで簡潔に表現した
批判したいならば代替コードを出すべき
2022/05/20(金) 08:52:03.20ID:Te9amNUZ
フィボナッチ数列を他の計算の入力として使わないのなら何番目まで必要なのかをusizeとかで受け取ってBigUintのイテレータ返すので十分かな
2022/05/20(金) 08:54:16.47ID:Te9amNUZ
うげ
俺が出したのは>>185の言う代替案じゃないから
勘違いしそうだから念のため
2022/05/20(金) 09:01:03.34ID:SXN+DpBP
>>186
うん
今回はオーバーフローの対処をしろと言う>>177のリクエストに応じたのみ
2022/05/20(金) 09:03:09.77ID:SXN+DpBP
>>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)
})
}
2022/05/20(金) 09:18:53.35ID:qCLhnuk6
firefoxってどのへんにrust使ってるんだっけ
2022/05/20(金) 10:35:37.22ID:t0eTe6yv
>>189
さらに汚くしてどうすんのw
2022/05/20(金) 10:55:09.60ID:SXN+DpBP
>>191
汚いと言うならば同じ動作をするもっと美しいコードを出そう
「汚い」と言う人はいつもコードを出せない人だから負け惜しみで言っているのかと
2022/05/20(金) 10:59:18.09ID:6DrTvbrK
>>185
unfold使ってた時と同じでフラグという捉え方がコードが汚くなる原因
命名を疎かにせず変数や関数の型を考えよう
そうすればOptionが必要なものと不要なものくらいは区別できるはず
ヒント終わり


コンパイルができた動けばいいだけのコードからは早めに卒業しようね
2022/05/20(金) 11:03:32.49ID:WF81UNfB
>>192
君のコードを汚いという人間は一人や二人ではないだろう?
それがなぜなのか?
なぜ汚いと言われるのか?
自分で考えて足掻いてこそ成長するんだよ
2022/05/20(金) 11:08:36.62ID:5NF4cE9g
>>192
ちなみに汚いコードの反対は汚くないコード
美しいコードである必要はない
実践で重要なのは美しいコードよりも汚くないコードを書くこと
2022/05/20(金) 11:16:04.61ID:SXN+DpBP
>>193
有無を表現することが必要だからOptionを使うのが最適
Optionを使わずに書けるのならばコードを出そう

>>194
今まで言われたことない
今回言われたから、いつも汚いを連呼しているがコードを出せないダメな人かなと
反論があるならばコードで示そう
2022/05/20(金) 11:26:17.74ID:SXN+DpBP
>>195
その通りだよ
だから汚くなく、簡素でわかりやすく、無駄をせずに効率も良いコードを>>189に出した
同じ動作と同じ効率でもっと簡素に書けるのならばコードを出してごらん
2022/05/20(金) 11:47:37.20ID:hTlaNj/P
ベンチも取らずに効率とな?
2022/05/20(金) 11:48:38.99ID:50J2u53j
>>184
その4つは全部並んでたからインパクト強いけど
個々で見るとムーブや値渡しの間違った理解は複オジ特有じゃないからちょっと弱いな
2022/05/20(金) 12:16:58.58ID:lLMUMPSU
>>196
>今まで言われたことない
すごーいwww
お薬必要ですね
2022/05/20(金) 12:28:38.69ID:pMSjr2Vl
後出しでどんどん条件が変わっていくから話がまとまる訳がない
これ以上続けたいならソース貼るときは前提条件を共有した上でコンパクトに議論を終わらせてくれ
2022/05/20(金) 19:05:29.84ID:eTvpznuT
複オジは断念したみたいだから
俺の考える汚くないコードを参考までに貼っとく
https://play.rust-lang.org/?edition=2021&gist=cb739f9fa655a73ced7e87e681237d9f
2022/05/20(金) 19:24:47.86ID:P7xg55cn
まずイテレータやめろや
2022/05/20(金) 19:37:01.42ID:0DaneQt4
 
 __     __  ___ _____  _____     ___ ___    ___
 |   |    /  /  |  //       | /__  __/ [][] _| |_| |__ _| |_
 |   |.   /  /  /  / /   / ̄ ̄|. l    / /     |    _  | |_  レ'~ ̄|
 |   |  /  /  /  / /   /.  / /    |  |___      ̄|  | / / /   /| |
 |   |  /  /  /  / /    ̄ ̄ /     \__|     |  |  ̄ /_  /  | |_
 |   |. /  /  /  / /   / ̄ ̄ ̄                |_|     |__|   \/
 |   |/  /  /  /. /   /  
 |.     /  /  /  /   / 
 |    /. /   | ./   /  
  ̄ ̄ ̄   ̄ ̄ ̄.  ̄ ̄ 
2022/05/20(金) 21:06:57.55ID:/0md/MJf
tauriどうよ
2022/05/20(金) 21:13:38.21ID:zMcvGPNW
>>202
successorsバージョンはシンプルでいいね
2022/05/20(金) 21:27:07.51ID:P7xg55cn
>>190
https://wiki.mozilla.org/Oxidation#Shipped
話題になったServo関連はもちろんとして、他は文字エンコーディングとか言語関連での採用が多いみたいね

https://4e6.github.io/firefox-lang-stats/
行数ではGecko全体の10%程度
208デフォルトの名無しさん
垢版 |
2022/05/20(金) 21:57:08.66ID:j6iPiVjl
RustとC++を学ぼうと思ってるプログラミング初心者です。
両方ともそのうち学ぶとして、どっちを先にした方がいい感じですか?
209デフォルトの名無しさん
垢版 |
2022/05/20(金) 21:59:12.98ID:j6iPiVjl
あ、スレチだったかも...すみません
210デフォルトの名無しさん
垢版 |
2022/05/20(金) 22:06:04.12ID:j6iPiVjl
連投すみません...
C++ vs Rustのスレ終わってたから一応どっちにすべきかここで聞きたい
ちなみに自分の中では
・C++のほうがほんの少しだけ速い
・Rustのほうが書くのとかメモリとか楽
・C++のほうが実行環境とか充実してる
みたいな認識になってます。よろしくお願いします
2022/05/20(金) 23:40:49.05ID:1Ryh5lzf
>>207
ほー
ありがとう
2022/05/21(土) 00:10:36.10ID:gcU5DXZF
>>210
どういう領域のプログラムを作りたいかでどっちが適してるか変わるからもうちょっと学ぶ背景とか教えて
213デフォルトの名無しさん
垢版 |
2022/05/21(土) 01:38:57.59ID:qnjM1Lxc
>>210
仕事で使うほう
2022/05/21(土) 01:45:27.47ID:7bviEaCH
なんのために学ぶのかにもよるけど、なんにせよC言語とJavaScriptはエンジニアなら全員勉強すべき
急いでないなら、そのあとでC++とRustを選んでもいい
2022/05/21(土) 01:46:40.74ID:t6WWJYF7
まぁC言語だよな
2022/05/21(土) 01:58:05.82ID:y9SWDgH5
せっかくRustのスレに来たんだしRustをやりなよ
C++をかじるのはいいけど仕事で使うわけでないなら
じゃじゃ馬を飼い馴らすバッドノウハウを今更学ぶ必要はないよ
217デフォルトの名無しさん
垢版 |
2022/05/21(土) 07:32:51.54ID:yS5lPrM7
回答ありがとうございます…
とりあえずRustにしておこうと思います
2022/05/21(土) 09:16:08.98ID:iurUdiXY
>>217
Rustの入門書をぱらぱらと何冊か見たけど計算の優先順位の話とか普通のプログラム入門は全く書かれてないよね
C++の方は確実に書かれてる

入門はCやC++の方がいいと思うよ
2022/05/21(土) 09:22:23.20ID:iurUdiXY
個人的にRust以外にやったほうがいいと思う言語
C C++(深入りしない) java

多分必用になる(と思われる)言語
javascript python
2022/05/21(土) 09:40:03.63ID:wAUuWoIP
Cをざっと学んでからRustかな
C++は(深入りしない)が重要なんだけど、初心者が自分で判断するのは厳しい
既存の資料もC++98から20まで玉石混交という感じだし
2022/05/21(土) 09:44:15.57ID:iurUdiXY
自分はOOPは学んだほうがいいと思う派なのでRustだけでは不十分だと感じる
絶対業務で必要になるし
C++ java C# 学んだほうがいいと思う
2022/05/21(土) 10:11:16.37ID:gcU5DXZF
いろんなパラダイムの言語を触るのが良いよ
2022/05/21(土) 10:19:06.60ID:5oK/i29u
Rustを学ぶならばほとんどの分野でC++とJavaは不要
C言語は実用とは別に最初に基礎教養として学んでおいたほうがRustの理解が早い
C→Rustも可能だが、その前にスクリプト言語などでオブジェクト指向(のうちインスタンスとメソッド呼び出し等)と、非同期(async/await)をそれぞれ学んでおくと楽だと思う
その場合のスクリプト言語はJavaScript(ただしHTML/CSSに踏み込まなくて済むNode.js)がオススメかな
2022/05/21(土) 10:46:13.19ID:JD6rd3hb
単に習得するためなら Rust を学ぶために他の言語を先に知っておく必要はないが、
C++ を先に使っていると Rust の「ありがたみ」に納得しやすいという意見はあるみたいだね。
まあ C が基礎教養であるというのは私も同意。
2022/05/21(土) 10:50:44.47ID:iurUdiXY
Rustだけを学ぼうとしてもその環境が整ってないんですよ

さっきも書いたけど入門書に演算子の優先順位とかそのレベルの話がどこにも書かれてない
他の言語に乗っかって入門するしかない
2022/05/21(土) 10:59:08.26ID:5oK/i29u
>>224
C++は不要
Cを習得しておけばRustのありがたみがわかる
2022/05/21(土) 11:34:26.44ID:jUaeJjgy
>>225
演算子の優先順位の話はオライリー本には書いてあるよ
プログラミングを初めて学ぶ人間がRustから始めるべきじゃないというのは完全同意だけど
2022/05/21(土) 11:47:35.41ID:vC8/2hE9
ぼくはガベージコレクションが嫌いです
2022/05/21(土) 11:50:19.62ID:KkLFGMWv
オライリー本もヒープとかスタックとか出てくるあたり、CやC++で動的メモリ確保の面倒くささを知ってる人向けだと思う
2022/05/21(土) 11:50:43.88ID:uR6sIAw1
メモリ管理まわりの勉強はcで必須
2022/05/21(土) 11:56:37.53ID:5oK/i29u
逆に考えよう
C→Rustと進むだけで十分であり、何か困ることある?
困ることないよな
232デフォルトの名無しさん
垢版 |
2022/05/21(土) 12:04:35.32ID:CYzzzsUy
ゴミ集めてどうするんだっていう。
2022/05/21(土) 12:06:48.99ID:gyqhSlT2
十分かどうかはさておき
そもそもCをすべきかどうかというと微妙かもしれない
Cしかやってなさそうな人特有の
・変数がたくさんとっちらかった
・変数名が暗号めいてて
・ifやforが多重になってて
・グローバル変数を平気で使っちゃってる
コードみたことあるでしょ
それはそうするしかやり方を知らないから

一方、抽象度の高い言語からやった人は先にそっちに慣れるんで
List(8, 9, 3, 1).sorted.reverse.foreach(print)
こういうふうにスッキリ書けるのを目指してくれる
2022/05/21(土) 12:09:45.76ID:0tb1eDc3
オブジェクト指向がいちばん大事
2022/05/21(土) 12:10:08.62ID:Uoz2jgaJ
格下相手の話だけイキイキするな
2022/05/21(土) 12:12:07.01ID:5oK/i29u
>>233
それは同感で非常に重要
だから最初に>>223でCとJavaScriptを先に学ぶのをオススメと書いた
237デフォルトの名無しさん
垢版 |
2022/05/21(土) 12:39:26.68ID:5HpZ3As+
ありがたみなんて知る必要ないでしょ
典型的な老害だな
2022/05/21(土) 12:39:58.62ID:0jWT+RR4
>>221
C++ と java はやったけど C# 必要ですか?
2022/05/21(土) 13:06:24.69ID:dZzrxVLl
Rustは、プログラミング経験者向けの情報が多い気がするから、PythonとかJavascript辺りをサラッと試してからでも良い気はする。

コンパイルとはとか、型って何?とか。
2022/05/21(土) 14:18:25.43ID:2XTF0B5o
>>235
それな
自演ネタふりの可能性すらある
2022/05/21(土) 14:45:48.56ID:is6KmnjI
いつも同じパターン
質問や相談があると、答えたり情報を出したりせずに、それらをしている人たちをバカにする
コードが出ると、代案コードを出すわけでもなく、とにかく批判のみ行なう
2022/05/21(土) 14:51:09.52ID:/NlDQvZW
プログラミング初心者は言語知識よりも
プログラミングという行為がどういうものなのか
どういうことを考える必要があるかというメタ認知を得ることが最も重要

メタ認知を獲得するために最も効果・効率ともに高い方法は
考えて・書いて・動かして結果を確認するというフィードバックサイクルをとにかく繰り返し回すこと

初心者は上記のサイクルが回しやすい言語から始めると後々の成長が早い
C/C++/Rustはサイクルを回すために越えなければならないハードルが相対的に高いため
現代では初心者向け言語ではない
2022/05/21(土) 14:57:49.13ID:7TYnpeBW
>>241
被害妄想はげしくね?
代案も代替コードもそれなりに出てるよね?
それに悪い物を悪い(汚い物を汚い)というためだけに毎回代案を用意する必要なんて全くないよ
2022/05/21(土) 15:08:42.12ID:d40Kl4Hf
意訳:
ぼくちゃんがかいたさいきょうのコードをひはんしないでくだしゃい
ぼくのかんがえたやつがさいきょうなんでしゅから
2022/05/21(土) 15:15:12.95ID:terB7Bhw
なでしこ(プログラミング言語)も使ってあげて、、
2022/05/21(土) 15:15:33.24ID:lzMNCHOR
お前ら>>205みたいなのにも反応してやれよ
2022/05/21(土) 15:46:51.93ID:zcBlczkH
>>246
前スレがいしゅつ
248デフォルトの名無しさん
垢版 |
2022/05/21(土) 16:45:07.99ID:dBYh2+4n
>>218
そのかかれてるC++入門本のタイトルあげてみろ
249デフォルトの名無しさん
垢版 |
2022/05/21(土) 16:48:39.25ID:dBYh2+4n
>>225
お前、>>218 で *計算*の優先順位って書いてるじゃん。
>>225 でしれっと演算子の優先順位にしてんじゃねーよ。
250デフォルトの名無しさん
垢版 |
2022/05/21(土) 16:54:22.75ID:dBYh2+4n
お前ら新しい言語勉強する時に本読まないの?
たいていの本には想定する読者ってのが最初のほうに書いているだろ。
現在出版されてるRustの本で他の言語全く使った事ない読者を想定してる本はあるのか?
2022/05/21(土) 17:14:51.81ID:is6KmnjI
>>246
Tauriではなくweb-view crateがシンプルで良いと思う
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況