【Rust设计模式之Fold模式】

Rust设计模式之Fold


Fold (折叠)

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


代码示例:

iterator fold:

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

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

代码示例:

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模式,一般的业务逻辑相对的较少能够涉及到此,不过多懂一些也是极好的~

"万全之计便是即刻行动"

相关推荐
sanx182 分钟前
从零搭建体育比分网站完整步骤
java·开发语言
若水晴空初如梦5 分钟前
QT聊天项目DAY09
开发语言·qt·bootstrap
leo__52028 分钟前
matlab 产生载频和宽度的脉冲串,并叠加高斯白噪声
开发语言·人工智能·matlab
关岭风尘29 分钟前
Matlab/Simulink - BLDC直流无刷电机仿真基础教程(七) - 波形解析专题P2
开发语言·matlab·bldc电机·相线接错·电机缺相
冼紫菜40 分钟前
Spring 项目无法连接 MySQL:Nacos 配置误区排查与解决
java·spring boot·后端·mysql·docker·springcloud
大G哥1 小时前
用 Go 和 TensorFlow 实现图像验证码识别系统
开发语言·后端·golang·tensorflow·neo4j
一个憨憨coder2 小时前
Spring 如何解决循环依赖问题?
java·后端·spring
钢铁男儿2 小时前
深入解析C#参数传递:值参数 vs 引用参数
java·开发语言·c#
代码哈士奇2 小时前
认识中间件-以及两个简单的示例
后端·中间件·typescript·nodejs·nest
努力努力再努力wz2 小时前
【c++深入系列】:万字详解vector(附模拟实现的vector源码)
运维·开发语言·c++·c