[過去ログ]
Rust part24 (1002レス)
Rust part24 http://mevius.5ch.net/test/read.cgi/tech/1716759686/
上
下
前次
1-
新
通常表示
512バイト分割
レス栞
抽出解除
必死チェッカー(本家)
(べ)
自ID
レス栞
あぼーん
このスレッドは過去ログ倉庫に格納されています。
次スレ検索
歴削→次スレ
栞削→次スレ
過去ログメニュー
843: デフォルトの名無しさん [sage] 2024/07/14(日) 07:37:29.94 ID:iqWqiKXK >>841 Rustのtraitにはクラスのような継承はないけど、抽象的なコードを継承できるよ http://mevius.5ch.net/test/read.cgi/tech/1716759686/843
844: デフォルトの名無しさん [sage] 2024/07/14(日) 07:37:59.13 ID:iqWqiKXK 例えばIteratorのtraitにはこのようにfoldメソッドのコードがあって fn fold<B, F>(mut self, init: B, mut f: F) -> B where Self: Sized, F: FnMut(B, Self::Item) -> B, { let mut accum = init; while let Some(x) = self.next() { accum = f(accum, x); } accum } http://mevius.5ch.net/test/read.cgi/tech/1716759686/844
845: デフォルトの名無しさん [sage] 2024/07/14(日) 07:39:51.02 ID:iqWqiKXK 未知のIteratorであっても重複コードを書くことなく自動的にこのfoldメソッドが使える http://mevius.5ch.net/test/read.cgi/tech/1716759686/845
846: デフォルトの名無しさん [sage] 2024/07/14(日) 07:40:10.97 ID:iqWqiKXK クラスのメソッド継承との決定的な違いは、このコードにメンバー変数は一切登場せず、つまりいかなる構成の型からも独立した抽象的なコードであること http://mevius.5ch.net/test/read.cgi/tech/1716759686/846
849: デフォルトの名無しさん [sage] 2024/07/14(日) 10:32:15.39 ID:iqWqiKXK 言語によって呼び名や使い分けが微妙に異なるけど Rustでは2種類をこう呼び分けています foldは初期値を別途指定する万能型の畳み込み reduceは初期値が最初の要素となる畳み込み http://mevius.5ch.net/test/read.cgi/tech/1716759686/849
850: デフォルトの名無しさん [sage] 2024/07/14(日) 10:33:24.33 ID:iqWqiKXK そして万能型のfoldを呼び出す形で このような特定の型の構造に依存しない抽象的なコードが trait Iteratorに用意されているため使えます fn reduce<F>(mut self, f: F) -> Option<Self::Item> where Self: Sized, F: FnMut(Self::Item, Self::Item) -> Self::Item, { let first = self.next()?; Some(self.fold(first, f)) } http://mevius.5ch.net/test/read.cgi/tech/1716759686/850
851: デフォルトの名無しさん [sage] 2024/07/14(日) 11:05:51.89 ID:iqWqiKXK なぜ二種類あるのか?というと 長さ0だと最初の要素すらないため reduceはOption型が返る特徴があります 例えば和を求める場合でも 長さ0だったらNoneになってほしいならば reduce(|sum, n: i32| sum + n) 長さ0なら和が0となってほしいならば fold(0, |sum, n: i32| sum + n) と使い分けることができます ちなみに後者はsum()メソッドが用意されています http://mevius.5ch.net/test/read.cgi/tech/1716759686/851
852: デフォルトの名無しさん [sage] 2024/07/14(日) 11:33:51.37 ID:iqWqiKXK ごめんなさい >>851で型指定「: i32」の部分は不要です Iteratorの要素の型に必ず定まります 空配列[]から始めると型指定がどこにもないため横着してそこで指定しちゃったという顛末でした http://mevius.5ch.net/test/read.cgi/tech/1716759686/852
856: デフォルトの名無しさん [sage] 2024/07/14(日) 13:21:58.79 ID:iqWqiKXK >>855 そういうことではないよ RustではOption型やResult型でエラーや異常値を含めて正しい状況を値として得られるんだよ 例えば長さ0で初期値なしの時に Pythonだとエラーだよね Rustは常に値として返してくれて今回はOption<Self::Item>型 http://mevius.5ch.net/test/read.cgi/tech/1716759686/856
858: デフォルトの名無しさん [sage] 2024/07/14(日) 14:15:44.82 ID:iqWqiKXK Rustならrev().fold(...)だね http://mevius.5ch.net/test/read.cgi/tech/1716759686/858
メモ帳
(0/65535文字)
上
下
前次
1-
新
書
関
写
板
覧
索
設
栞
歴
スレ情報
赤レス抽出
画像レス抽出
歴の未読スレ
AAサムネイル
Google検索
Wikipedia
ぬこの手
ぬこTOP
0.043s