Rust实现Go的getEnforcer方法时如何返回Result<Enforcer, Box<dyn Error>>
实现方案
你当前写法的问题是直接使用[]访问HashMap,当key不存在时会直接触发panic,无法实现Go版本中不存在返回错误的逻辑。Rust标准库的HashMap提供了get系列方法专门处理这类场景,返回Option类型来标识值是否存在,再转换为符合你函数签名的Result即可。
版本1:返回不可变引用(最贴合Go原逻辑,无需复制所有权)
Go原代码返回的是casbin.Enforcer的指针,对应Rust场景下返回不可变引用性能最优,无需转移或复制所有权:
use std::error::Error; use std::collections::HashMap; // 这里假设你已经导入了casbin的Enforcer类型 struct Server { enforcer_map: HashMap<i32, Enforcer>, } impl Server { // 不需要修改Server的话用&self即可,不需要可变借用 fn get_enforcer(&self, handle: i32) -> Result<&Enforcer, Box<dyn Error>> { self.enforcer_map .get(&handle) // Option转Result,None时返回自定义错误 .ok_or_else(|| "enforcer not found".into()) } }
版本2:返回可变引用
如果你需要修改获取到的Enforcer实例,可以使用get_mut方法返回可变引用:
fn get_enforcer_mut(&mut self, handle: i32) -> Result<&mut Enforcer, Box<dyn Error>> { self.enforcer_map .get_mut(&handle) .ok_or_else(|| "enforcer not found".into()) }
版本3:返回拥有所有权的Enforcer
如果你确实需要将Enforcer的所有权从HashMap中移出(或复制),且Enforcer实现了Clone trait,可以用以下写法:
fn get_enforcer_owned(&self, handle: i32) -> Result<Enforcer, Box<dyn Error>> { self.enforcer_map .get(&handle) // 复制一份Enforcer实例 .cloned() .ok_or_else(|| "enforcer not found".into()) }
补充说明
- Rust社区惯例使用蛇形命名,建议将
getEnforcer改为get_enforcer、enforcerMap改为enforcer_map以符合规范 - 如果需要更结构化的错误类型,可以自定义错误枚举并实现
Errortrait,替代当前直接用字符串转Box<dyn Error>的简单写法
内容的提问来源于stack exchange,提问作者eth_sign
相关产品推荐
相关产品推荐

