伟峰 發表於 2024-12-16 10:27:16

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

<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li>示例运行结果</li><li>代码解析</li><li>优化方向</li><li>总结</li></ul></div><p>在 Rust 中,如果想为 enum 实现一个带多参数的 Hook 机制,可以结合模式匹配和枚举来处理。这种方式可以扩展到支持不同类型的输入参数和逻辑处理。</p>
<p>以下是一个实现 enum 和 Hook 的多参数机制的完整示例:</p>
<p>定义枚举和 Hook 类型</p>
<div class="jb51code"><pre class="brush:plain;">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&lt;dyn Fn(HookInput) -&gt; HookOutput + Send + Sync&gt;;
// Hook 管理器
struct HookManager {
    hooks: Mutex&lt;Vec&lt;HookFn&gt;&gt;,
}
impl HookManager {
    fn new() -&gt; Self {
      Self {
            hooks: Mutex::new(Vec::new()),
      }
    }
    // 添加 Hook 函数
    fn add_hook&lt;F&gt;(&amp;self, hook: F)
    where
      F: Fn(HookInput) -&gt; HookOutput + Send + Sync + 'static,
    {
      self.hooks.lock().unwrap().push(Arc::new(hook));
    }
    // 执行所有 Hook
    fn execute_hooks(&amp;self, input: HookInput) -&gt; Vec&lt;HookOutput&gt; {
      let hooks = self.hooks.lock().unwrap();
      hooks.iter().map(|hook| hook(input.clone())).collect()
    }
}
// 实现 Clone 对 HookInput 的支持
impl Clone for HookInput {
    fn clone(&amp;self) -&gt; Self {
      match self {
            HookInput::Add(a, b) =&gt; HookInput::Add(*a, *b),
            HookInput::Multiply(a, b) =&gt; HookInput::Multiply(*a, *b),
            HookInput::Concat(a, b) =&gt; HookInput::Concat(a.clone(), b.clone()),
      }
    }
}</pre></div>
<p>使用 Hook 管理器</p>
<div class="jb51code"><pre class="brush:plain;">fn main() {
    let manager = HookManager::new();
    // 添加第一个 Hook:处理 Add
    manager.add_hook(|input| match input {
      HookInput::Add(a, b) =&gt; {
            println!("Adding: {} + {}", a, b);
            HookOutput::Sum(a + b)
      }
      _ =&gt; HookOutput::None,
    });
    // 添加第二个 Hook:处理 Multiply
    manager.add_hook(|input| match input {
      HookInput::Multiply(a, b) =&gt; {
            println!("Multiplying: {} * {}", a, b);
            HookOutput::Product(a * b)
      }
      _ =&gt; HookOutput::None,
    });
    // 添加第三个 Hook:处理 Concat
    manager.add_hook(|input| match input {
      HookInput::Concat(a, b) =&gt; {
            println!("Concatenating: {} + {}", a, b);
            HookOutput::Combined(format!("{}{}", a, b))
      }
      _ =&gt; 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);
}</pre></div>
<p class="maodian"></p><h2>示例运行结果</h2>
<blockquote><p>Adding: 3 + 4<br />Results for Add: </p>
<p>Multiplying: 5 * 6<br />Results for Multiply: </p>
<p>Concatenating: Hello + World<br />Results for Concat: </p></blockquote>
<p class="maodian"></p><h2>代码解析</h2>
<p>多参数处理:</p>
<p>&bull; HookInput 使用枚举定义了不同的输入类型(如 Add(i32, i32)、Multiply(i32, i32)、Concat(String, String))。<br />&bull; 每个变体表示不同的逻辑分支,可扩展为更多的操作类型。</p>
<p>多返回值处理:<br />&bull; HookOutput 使用枚举定义了不同的输出类型(如 Sum(i32)、Product(i32)、Combined(String))。<br />&bull; 每个变体对应不同的返回值逻辑。</p>
<p>Hook 管理器:<br />&bull; HookManager 使用 Vec 存储所有注册的 Hook 函数。<br />&bull; execute_hooks 遍历所有 Hook,并根据输入调用相应逻辑,收集返回值。</p>
<p>扩展性:<br />&bull; 可以轻松添加新的 HookInput 和 HookOutput 枚举变体,扩展新的逻辑。<br />&bull; 新的 Hook 函数只需要匹配新添加的变体即可。</p>
<p class="maodian"></p><h2>优化方向</h2>
<p>并行执行:<br />如果多个 Hooks 可以并行执行,可以引入并行迭代工具,如 rayon。</p>
<div class="jb51code"><pre class="brush:plain;">use rayon::prelude::*;
hooks.par_iter().map(|hook| hook(input.clone())).collect()</pre></div>
<p>动态分派:<br />如果需要动态注册更多类型的操作,可以将输入参数定义为 Box,并结合 downcast 使用。返回值过滤:<br />可以在 execute_hooks 中过滤掉 HookOutput::None 的结果,以简化结果处理。</p>
<p class="maodian"></p><h2>总结</h2>
<p>&bull; 核心思路:<br />利用 enum 表达多种输入和输出类型,配合模式匹配实现多参数和多逻辑分支的 Hook 机制。<br />&bull; 扩展性强:<br />通过新增枚举变体,可以轻松支持更多的输入和返回值类型。<br />&bull; 适用场景:<br />&bull; 插件系统<br />&bull; 事件驱动架构<br />&bull; 动态业务逻辑处理</p>
<p>到此这篇关于Rust中用enum实现多参数Hook机制的文章就介绍到这了,更多相关Rust enum 多参数Hook机制内容请搜索琼殿技术社区以前的文章或继续浏览下面的相关文章希望大家以后多多支持琼殿技术社区!</p>
                           
                            <div class="art_xg">
                              <b>您可能感兴趣的文章:</b><ul><li>Rust数据类型之结构体Struct的使用</li><li>Rust&nbsp;Struct结构体详解</li><li>解析Rust struct 中的生命周期</li><li>解析rust中的struct</li><li>Rust中non_exhaustive的enum使用确保程序健壮性</li><li>在Rust中要用Struct和Enum组织数据的原因解析</li></ul>
                            </div>

                        </div>
                        <!--endmain-->
頁: [1]
查看完整版本: Rust中用enum实现多参数Hook机制完整代码