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

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

相关推荐
跟着珅聪学java1 小时前
spring boot +Elment UI 上传文件教程
java·spring boot·后端·ui·elementui·vue
我命由我123452 小时前
Spring Boot 自定义日志打印(日志级别、logback-spring.xml 文件、自定义日志打印解读)
java·开发语言·jvm·spring boot·spring·java-ee·logback
徐小黑ACG2 小时前
GO语言 使用protobuf
开发语言·后端·golang·protobuf
0白露4 小时前
Apifox Helper 与 Swagger3 区别
开发语言
Tanecious.4 小时前
机器视觉--python基础语法
开发语言·python
叠叠乐5 小时前
rust Send Sync 以及对象安全和对象不安全
开发语言·安全·rust
战族狼魂5 小时前
CSGO 皮肤交易平台后端 (Spring Boot) 代码结构与示例
java·spring boot·后端
niandb6 小时前
The Rust Programming Language 学习 (九)
windows·rust
Tttian6226 小时前
Python办公自动化(3)对Excel的操作
开发语言·python·excel
杉之6 小时前
常见前端GET请求以及对应的Spring后端接收接口写法
java·前端·后端·spring·vue