当前位置: 首页 > article >正文

【Rust设计模式之Fold模式】

Rust设计模式之Fold


Fold (折叠)
如Rust Collection中的fold方法,是消耗迭代器适配器,将闭包应用于每一个元素,并将结果返回一样。Fold模式的中心思想也是如此,将元素折叠处理,最终计算出新的元素。


代码示例:
iterator fold:

fn main() {
    let even_sum = (1..=10).fold(0, |acc, num| if num % 2 == 0 { acc + num } else { acc });
    println!("{even_sum:?}");
}

而我们自己实现的Fold模式,一般用于映射数据结构,不同于面向对象的原地修改,由于Rust的引用和借用以及不可变性,生成新的结构从而替代老的结构调理更为清晰。
代码示例:

mod ast {
    pub enum Stmt {
        Node(Box<Node>),
        Let(Box<Info>, Box<Node>),
    }

    pub struct Info {
        value: String,
    }

    pub enum Node {
        IntLit(i64),
    }
}
mod fold {

    use crate::ast::{self, Info, Node, Stmt};

    pub trait Folder {
        // A leaf node just returns the node itself. In some cases, we can do this
        // to inner nodes too.
        fn fold_Info(&mut self, n: Box<Info>) -> Box<Info> {
            n
        }
        // Create a new inner node by folding its children.
        fn fold_stmt(&mut self, s: Box<Stmt>) -> Box<Stmt> {
            match *s {
                Stmt::Node(e) => Box::new(Stmt::Node(self.fold_Node(e))),
                Stmt::Let(n, e) => Box::new(Stmt::Let(self.fold_Info(n), self.fold_Node(e))),
            }
        }
        fn fold_Node(&mut self, e: Box<Node>) -> Box<Node> {
            e
        }
    }
}

总结:通常来说只有我们在自己编写一些数据结构的时候方才用得到这种fold模式,一般的业务逻辑相对的较少能够涉及到此,不过多懂一些也是极好的~

“万全之计便是即刻行动”


http://www.kler.cn/a/386140.html

相关文章:

  • 检测敏感词功能
  • ubuntu20.04 colmap 安装2024.11最新
  • 提升前端性能:如何优化多个异步请求的执行效率Promise.all()
  • STM32中,不进行printf改写通过函数达到同款效果
  • 【项目组件】第三方库——websocketpp
  • 云运维基础
  • Java 中的 Arrays.sort () 方法:排序的利器
  • GOT-OCR:开源免费的OCR项目,多语言多模态识别,端到端识别新体验!不仅能识别文字,连数学公式、图表都不在话下!
  • 服装品牌零售业态融合中的创新发展:以开源 AI 智能名片 S2B2C 商城小程序为视角
  • unity中 骨骼、纹理和材质关系
  • 软件工程 软考
  • 在 Bash 中获取 Python 模块变量列
  • 2023上半年上午(1~75)
  • 使用EasyExcel实现导出excel文件时生成多级下拉选
  • 梧桐数据库浅谈查询优化技巧
  • UE5 metahuman 头发物理模拟
  • Meta 上周宣布正式开源小型语言模型 MobileLLM 系列
  • 怎样使用pycharm的服务?
  • FFmpeg - 音视频文件编码
  • lua入门教程:ipairs
  • DevExpress JS ASP.NET Core v24.1亮点 - 支持DateOnly/TimeOnly类型
  • linux强制修改mysql的root账号密码
  • Elasticsearch的数据类型
  • Zookeeper运维秘籍:四字命令基础、详解及业务应用全解析
  • 机器学习—sigmoid的替代品
  • 开发中使用UML的流程_01概述