Rust中用enum实现多参数Hook机制完整代码

 更新时间:2024年12月16日 10:27:16   作者:老码GoRust  
在 Rust 中,如果想为enum实现一个带多参数的 Hook 机制,可以结合模式匹配和枚举来处理,这种方式可以扩展到支持不同类型的输入参数和逻辑处理,下面通过示例代码介绍Rust中用enum实现多参数Hook机制,感兴趣的朋友一起看看吧

在 Rust 中,如果想为 enum 实现一个带多参数的 Hook 机制,可以结合模式匹配和枚举来处理。这种方式可以扩展到支持不同类型的输入参数和逻辑处理。

以下是一个实现 enum 和 Hook 的多参数机制的完整示例:

定义枚举和 Hook 类型

use std::sync::{Arc, Mutex};
// 定义一个多参数枚举
enum HookInput {
    Add(i32, i32),
    Multiply(i32, i32),
    Concat(String, String),
}
// 定义一个多返回值枚举
enum HookOutput {
    Sum(i32),
    Product(i32),
    Combined(String),
    None,
}
// 定义 Hook 类型
type HookFn = Arc<dyn Fn(HookInput) -> HookOutput + Send + Sync>;
// Hook 管理器
struct HookManager {
    hooks: Mutex<Vec<HookFn>>,
}
impl HookManager {
    fn new() -> Self {
        Self {
            hooks: Mutex::new(Vec::new()),
        }
    }
    // 添加 Hook 函数
    fn add_hook<F>(&self, hook: F)
    where
        F: Fn(HookInput) -> HookOutput + Send + Sync + 'static,
    {
        self.hooks.lock().unwrap().push(Arc::new(hook));
    }
    // 执行所有 Hook
    fn execute_hooks(&self, input: HookInput) -> Vec<HookOutput> {
        let hooks = self.hooks.lock().unwrap();
        hooks.iter().map(|hook| hook(input.clone())).collect()
    }
}
// 实现 Clone 对 HookInput 的支持
impl Clone for HookInput {
    fn clone(&self) -> Self {
        match self {
            HookInput::Add(a, b) => HookInput::Add(*a, *b),
            HookInput::Multiply(a, b) => HookInput::Multiply(*a, *b),
            HookInput::Concat(a, b) => HookInput::Concat(a.clone(), b.clone()),
        }
    }
}

使用 Hook 管理器

fn main() {
    let manager = HookManager::new();
    // 添加第一个 Hook:处理 Add
    manager.add_hook(|input| match input {
        HookInput::Add(a, b) => {
            println!("Adding: {} + {}", a, b);
            HookOutput::Sum(a + b)
        }
        _ => HookOutput::None,
    });
    // 添加第二个 Hook:处理 Multiply
    manager.add_hook(|input| match input {
        HookInput::Multiply(a, b) => {
            println!("Multiplying: {} * {}", a, b);
            HookOutput::Product(a * b)
        }
        _ => HookOutput::None,
    });
    // 添加第三个 Hook:处理 Concat
    manager.add_hook(|input| match input {
        HookInput::Concat(a, b) => {
            println!("Concatenating: {} + {}", a, b);
            HookOutput::Combined(format!("{}{}", a, b))
        }
        _ => HookOutput::None,
    });
    // 执行 Hook:Add
    let add_results = manager.execute_hooks(HookInput::Add(3, 4));
    println!("Results for Add: {:?}", add_results);
    // 执行 Hook:Multiply
    let multiply_results = manager.execute_hooks(HookInput::Multiply(5, 6));
    println!("Results for Multiply: {:?}", multiply_results);
    // 执行 Hook:Concat
    let concat_results = manager.execute_hooks(HookInput::Concat(
        "Hello".to_string(),
        "World".to_string(),
    ));
    println!("Results for Concat: {:?}", concat_results);
}

示例运行结果

Adding: 3 + 4
Results for Add: [Sum(7), None, None]

Multiplying: 5 * 6
Results for Multiply: [None, Product(30), None]

Concatenating: Hello + World
Results for Concat: [None, None, Combined("HelloWorld")]

代码解析

多参数处理:

• HookInput 使用枚举定义了不同的输入类型(如 Add(i32, i32)、Multiply(i32, i32)、Concat(String, String))。
• 每个变体表示不同的逻辑分支,可扩展为更多的操作类型。

多返回值处理:
• HookOutput 使用枚举定义了不同的输出类型(如 Sum(i32)、Product(i32)、Combined(String))。
• 每个变体对应不同的返回值逻辑。

Hook 管理器:
• HookManager 使用 Vec 存储所有注册的 Hook 函数。
• execute_hooks 遍历所有 Hook,并根据输入调用相应逻辑,收集返回值。

扩展性:
• 可以轻松添加新的 HookInput 和 HookOutput 枚举变体,扩展新的逻辑。
• 新的 Hook 函数只需要匹配新添加的变体即可。

优化方向

并行执行:
如果多个 Hooks 可以并行执行,可以引入并行迭代工具,如 rayon。

use rayon::prelude::*;
hooks.par_iter().map(|hook| hook(input.clone())).collect()

动态分派:
如果需要动态注册更多类型的操作,可以将输入参数定义为 Box,并结合 downcast 使用。返回值过滤:
可以在 execute_hooks 中过滤掉 HookOutput::None 的结果,以简化结果处理。

总结

• 核心思路:
利用 enum 表达多种输入和输出类型,配合模式匹配实现多参数和多逻辑分支的 Hook 机制。
• 扩展性强:
通过新增枚举变体,可以轻松支持更多的输入和返回值类型。
• 适用场景:
• 插件系统
• 事件驱动架构
• 动态业务逻辑处理

到此这篇关于Rust中用enum实现多参数Hook机制的文章就介绍到这了,更多相关Rust enum 多参数Hook机制内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Rust应用调用C语言动态库的操作方法

    Rust应用调用C语言动态库的操作方法

    这篇文章主要介绍了Rust应用调用C语言动态库,本文记录了笔者编写一个简单的C语言动态库,并通过Rust调用动态库导出的函数,需要的朋友可以参考下
    2023-01-01
  • 使用Rust语言搞定图片上传功能的示例详解

    使用Rust语言搞定图片上传功能的示例详解

    这篇文章主要为大家详细介绍了如何使用Rust语言搞定图片上传功能,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以参考一下
    2025-08-08
  • Rust中vector的详细用法

    Rust中vector的详细用法

    Rust和C++同样也有vector概念,本文主要介绍了Rust中vector的详细用法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-03-03
  • Rust 中的 Packages 与 Crates模块化构建的基础及开发流程

    Rust 中的 Packages 与 Crates模块化构建的基础及开发流程

    Rust中的Crate是编译器处理的最小代码单元,可以是二进制或库,每个Crate由一个CrateRoot文件(通常是src/main.rs或src/lib.rs)定义,本文给大家介绍Rust 中的 Packages 与 Crates模块化构建的基础及开发流程,感兴趣的朋友一起看看吧
    2025-02-02
  • 深入了解Rust的生命周期

    深入了解Rust的生命周期

    生命周期指的是引用保持有效的作用域,Rust的每个引用都有自己的生命周期。本文将通过示例和大家详细说说Rust的生命周期,需要的可以参考一下
    2022-12-12
  • 深入了解Rust的切片使用

    深入了解Rust的切片使用

    除了引用,Rust 还有另外一种不持有所有权的数据类型:切片(slice),切片允许我们引用集合中某一段连续的元素序列,而不是整个集合。本文让我们来深入了解Rust的切片
    2022-11-11
  • Rust CLI 项目构建的实现步骤

    Rust CLI 项目构建的实现步骤

    本文提供了一个完整的Rust CLI项目构建流程,以 anthropic-config 配置管理工具为例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-12-12
  • 详解thiserror库在Rust中的使用

    详解thiserror库在Rust中的使用

    在编程中,错误处理是一个至关重要的部分,在Rust中,我们经常使用Result和Option类型来进行错误处理,但有时,我们需要创建自定义的错误类型,这就是thiserror库发挥作用的地方,可以极大的简化代码,所以本文就给大家介绍一下如何使用thiserror
    2023-08-08
  • Rust中的函数指针详解

    Rust中的函数指针详解

    Rust是一种现代的系统编程语言,它支持函数指针。函数指针是指向函数的指针,可以将函数作为参数传递给其他函数或存储在变量中。Rust中的函数指针可以用于实现回调函数、动态分发和多态等功能。本文将介绍Rust中的函数指针的基本用法和高级用法。
    2023-05-05
  • Rust中的关联类型总结

    Rust中的关联类型总结

    关联类型是定义通用trait的一种机制。它允许在trait中定义一个或多个占位符类型,这些类型将在trait的实现中具体化。文中有详细示例代码供参考,需要的朋友可以阅读一下
    2023-05-05

最新评论