🙏

[Rustのデザインパターン学習] Fold [生成]

2023/01/22に公開

https://rust-unofficial.github.io/patterns/patterns/creational/fold.html

はじめに

上記Foldパターンの解説記事より学習内容を記載します

内容

  • See alsoセクションより
    • std::iter::Iteratorfold()メソッドがありますがFoldパターンではない
    • map()メソッドがFoldパターンに近い
fold()
map()
  • Motivationセクションより
    • 単純なデータ構造に対する単純な操作であればmap() を使って行うことができる
    • より複雑な操作の場合はFoldパターンを使うのが適切である
      • ex)
        1. 前のノードが後のノードの操作に影響を与える
        2. データ構造に対する反復処理が自明でない

コード例

  • map()メソッドを使う場合

    fn example_map(){
        let arr = [1, 2, 3];
        //各値を2倍した配列を作成
        let iter:Vec<i32> = arr.iter().map(|x| 2 * x).collect();
        println!("{:?}",iter);
    }
    
    fn main (){
        example_map();
    }            
    
    実行結果
    [2, 4, 6]
    
  • Foldパターンを使う場合

    fn main (){
        todo!()
    }
    

状況

参考リンク

https://users.rust-lang.org/t/fold-pattern-compared-with-visitor-pattern/77480

The Rust patterns bookではVisitorパターンとFoldパターンが似ていると言及しているがそれは不適切ではないか?と言及

https://github.com/rust-unofficial/patterns/issues/54

Foldパターンの理解が難しい件について

Discussion