[過去ログ] Rust part24 (1002レス)
前次1-
抽出解除 必死チェッカー(本家) (べ) 自ID レス栞 あぼーん

このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
843: 2024/07/14(日)07:37 ID:iqWqiKXK(1/10) AAS
>>841
Rustのtraitにはクラスのような継承はないけど、抽象的なコードを継承できるよ
844: 2024/07/14(日)07:37 ID:iqWqiKXK(2/10) AAS
例えば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);
 }
省2
845: 2024/07/14(日)07:39 ID:iqWqiKXK(3/10) AAS
未知のIteratorであっても重複コードを書くことなく自動的にこのfoldメソッドが使える
846: 2024/07/14(日)07:40 ID:iqWqiKXK(4/10) AAS
クラスのメソッド継承との決定的な違いは、このコードにメンバー変数は一切登場せず、つまりいかなる構成の型からも独立した抽象的なコードであること
849: 2024/07/14(日)10:32 ID:iqWqiKXK(5/10) AAS
言語によって呼び名や使い分けが微妙に異なるけど
Rustでは2種類をこう呼び分けています
foldは初期値を別途指定する万能型の畳み込み
reduceは初期値が最初の要素となる畳み込み
850
(1): 2024/07/14(日)10:33 ID:iqWqiKXK(6/10) AAS
そして万能型の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))
省1
851
(1): 2024/07/14(日)11:05 ID:iqWqiKXK(7/10) AAS
なぜ二種類あるのか?というと
長さ0だと最初の要素すらないため
reduceはOption型が返る特徴があります

例えば和を求める場合でも
長さ0だったらNoneになってほしいならば
reduce(|sum, n: i32| sum + n)

長さ0なら和が0となってほしいならば
fold(0, |sum, n: i32| sum + n)

と使い分けることができます
ちなみに後者はsum()メソッドが用意されています
852: 2024/07/14(日)11:33 ID:iqWqiKXK(8/10) AAS
ごめんなさい
>>851で型指定「: i32」の部分は不要です
Iteratorの要素の型に必ず定まります
空配列[]から始めると型指定がどこにもないため横着してそこで指定しちゃったという顛末でした
856: 2024/07/14(日)13:21 ID:iqWqiKXK(9/10) AAS
>>855
そういうことではないよ
RustではOption型やResult型でエラーや異常値を含めて正しい状況を値として得られるんだよ
例えば長さ0で初期値なしの時に
Pythonだとエラーだよね
Rustは常に値として返してくれて今回はOption<Self::Item>型
858: 2024/07/14(日)14:15 ID:iqWqiKXK(10/10) AAS
Rustならrev().fold(...)だね
前次1-
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル

ぬこの手 ぬこTOP 0.061s