Rust中用enum實(shí)現(xiàn)多參數(shù)Hook機(jī)制完整代碼
在 Rust 中,如果想為 enum 實(shí)現(xiàn)一個(gè)帶多參數(shù)的 Hook 機(jī)制,可以結(jié)合模式匹配和枚舉來(lái)處理。這種方式可以擴(kuò)展到支持不同類型的輸入?yún)?shù)和邏輯處理。
以下是一個(gè)實(shí)現(xiàn) enum 和 Hook 的多參數(shù)機(jī)制的完整示例:
定義枚舉和 Hook 類型
use std::sync::{Arc, Mutex};
// 定義一個(gè)多參數(shù)枚舉
enum HookInput {
Add(i32, i32),
Multiply(i32, i32),
Concat(String, String),
}
// 定義一個(gè)多返回值枚舉
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 函數(shù)
fn add_hook<F>(&self, hook: F)
where
F: Fn(HookInput) -> HookOutput + Send + Sync + 'static,
{
self.hooks.lock().unwrap().push(Arc::new(hook));
}
// 執(zhí)行所有 Hook
fn execute_hooks(&self, input: HookInput) -> Vec<HookOutput> {
let hooks = self.hooks.lock().unwrap();
hooks.iter().map(|hook| hook(input.clone())).collect()
}
}
// 實(shí)現(xiàn) Clone 對(duì) 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();
// 添加第一個(gè) Hook:處理 Add
manager.add_hook(|input| match input {
HookInput::Add(a, b) => {
println!("Adding: {} + {}", a, b);
HookOutput::Sum(a + b)
}
_ => HookOutput::None,
});
// 添加第二個(gè) Hook:處理 Multiply
manager.add_hook(|input| match input {
HookInput::Multiply(a, b) => {
println!("Multiplying: {} * {}", a, b);
HookOutput::Product(a * b)
}
_ => HookOutput::None,
});
// 添加第三個(gè) Hook:處理 Concat
manager.add_hook(|input| match input {
HookInput::Concat(a, b) => {
println!("Concatenating: {} + {}", a, b);
HookOutput::Combined(format!("{}{}", a, b))
}
_ => HookOutput::None,
});
// 執(zhí)行 Hook:Add
let add_results = manager.execute_hooks(HookInput::Add(3, 4));
println!("Results for Add: {:?}", add_results);
// 執(zhí)行 Hook:Multiply
let multiply_results = manager.execute_hooks(HookInput::Multiply(5, 6));
println!("Results for Multiply: {:?}", multiply_results);
// 執(zhí)行 Hook:Concat
let concat_results = manager.execute_hooks(HookInput::Concat(
"Hello".to_string(),
"World".to_string(),
));
println!("Results for Concat: {:?}", concat_results);
}示例運(yùn)行結(jié)果
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")]
代碼解析
多參數(shù)處理:
• HookInput 使用枚舉定義了不同的輸入類型(如 Add(i32, i32)、Multiply(i32, i32)、Concat(String, String))。
• 每個(gè)變體表示不同的邏輯分支,可擴(kuò)展為更多的操作類型。
多返回值處理:
• HookOutput 使用枚舉定義了不同的輸出類型(如 Sum(i32)、Product(i32)、Combined(String))。
• 每個(gè)變體對(duì)應(yīng)不同的返回值邏輯。
Hook 管理器:
• HookManager 使用 Vec 存儲(chǔ)所有注冊(cè)的 Hook 函數(shù)。
• execute_hooks 遍歷所有 Hook,并根據(jù)輸入調(diào)用相應(yīng)邏輯,收集返回值。
擴(kuò)展性:
• 可以輕松添加新的 HookInput 和 HookOutput 枚舉變體,擴(kuò)展新的邏輯。
• 新的 Hook 函數(shù)只需要匹配新添加的變體即可。
優(yōu)化方向
并行執(zhí)行:
如果多個(gè) Hooks 可以并行執(zhí)行,可以引入并行迭代工具,如 rayon。
use rayon::prelude::*; hooks.par_iter().map(|hook| hook(input.clone())).collect()
動(dòng)態(tài)分派:
如果需要?jiǎng)討B(tài)注冊(cè)更多類型的操作,可以將輸入?yún)?shù)定義為 Box,并結(jié)合 downcast 使用。返回值過(guò)濾:
可以在 execute_hooks 中過(guò)濾掉 HookOutput::None 的結(jié)果,以簡(jiǎn)化結(jié)果處理。
總結(jié)
• 核心思路:
利用 enum 表達(dá)多種輸入和輸出類型,配合模式匹配實(shí)現(xiàn)多參數(shù)和多邏輯分支的 Hook 機(jī)制。
• 擴(kuò)展性強(qiáng):
通過(guò)新增枚舉變體,可以輕松支持更多的輸入和返回值類型。
• 適用場(chǎng)景:
• 插件系統(tǒng)
• 事件驅(qū)動(dòng)架構(gòu)
• 動(dòng)態(tài)業(yè)務(wù)邏輯處理
到此這篇關(guān)于Rust中用enum實(shí)現(xiàn)多參數(shù)Hook機(jī)制的文章就介紹到這了,更多相關(guān)Rust enum 多參數(shù)Hook機(jī)制內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Rust結(jié)構(gòu)體的定義與實(shí)例化詳細(xì)講解
結(jié)構(gòu)體是一種自定義的數(shù)據(jù)類型,它允許我們將多個(gè)不同的類型組合成一個(gè)整體。下面我們就來(lái)學(xué)習(xí)如何定義和使用結(jié)構(gòu)體,并對(duì)比元組與結(jié)構(gòu)體之間的異同,需要的可以參考一下2022-12-12
Rust使用libloader調(diào)用動(dòng)態(tài)鏈接庫(kù)
這篇文章主要為大家介紹了Rust使用libloader調(diào)用動(dòng)態(tài)鏈接庫(kù)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09
從零開(kāi)始使用Rust編寫nginx(TLS證書快過(guò)期了)
wmproxy已用Rust實(shí)現(xiàn)http/https代理,?socks5代理,?反向代理,?負(fù)載均衡,?靜態(tài)文件服務(wù)器,websocket代理,四層TCP/UDP轉(zhuǎn)發(fā),內(nèi)網(wǎng)穿透等,本文給大家介紹從零開(kāi)始使用Rust編寫nginx(TLS證書快過(guò)期了),感興趣的朋友一起看看吧2024-03-03

