如何在Rust的match分支中将函数返回值赋值给新变量?
Rust中match语句内赋值函数返回值的正确方式
你的代码存在两处核心问题,同时可以根据Rust的错误处理习惯优化实现:
问题分析
- 语法错误:
Ok(results) => results_map = results),末尾多了一个右括号,会直接导致编译失败。 - 类型不匹配:
results_map声明为Option<Results>,但search成功返回的results是Results类型,不能直接赋值,需要用Some(results)包装成Option类型。
解决方案
方案1:保留Option,错误发生后继续执行
如果需要在错误发生后仍继续后续逻辑,可以修正语法和类型问题,将成功结果包装进Option:
pub fn run(config: Config) -> Result<(), Box<dyn Error>> { let mut results_map: Option<Results>; match search(&config.root_path) { Err(e) => { eprintln!("Error when calling run(): {:?}", e); results_map = None; }, Ok(results) => results_map = Some(results), // 修正语法并包装为Option } // 后续可通过if let判断是否有有效结果 if let Some(results) = results_map { // 处理results中的文件数据 } Ok(()) }
方案2:遵循Rust错误处理惯例,错误时直接返回
如果错误发生后无需继续执行,直接将错误返回给调用方是更符合Rust风格的写法,此时不需要使用Option:
pub fn run(config: Config) -> Result<(), Box<dyn Error>> { // 用match直接获取结果或返回错误 let results = match search(&config.root_path) { Err(e) => return Err(e.into()), // 将io::Error转换为Box<dyn Error> Ok(results) => results, }; // 直接使用results进行后续处理,比如遍历大文件列表 // for (path, size) in results.result_map { ... } Ok(()) }
额外优化:修正search函数的错误处理
你的search函数中仅打印visit_dirs的错误却返回Ok(results),会导致错误被隐藏。建议用?操作符自动传递错误:
pub fn search(path: &str) -> Result<Results, io::Error> { let root_path = Path::new(path); let mut results = Results { result_map: HashMap::new()}; // 若visit_dirs出错,直接返回错误;否则继续执行 visit_dirs(root_path, &mut results)?; Ok(results) }
内容的提问来源于stack exchange,提问作者John Harrington
相关产品推荐
相关产品推荐

