Rust函数返回Transaction却提示found `()`报错的原因及修复方法
报错原因
这个编译错误的根源和附带问题如下:
- 函数返回路径不完整
Rust强制要求函数所有可能的执行路径,都必须返回和签名声明一致的类型。当前代码只有在遍历到匹配tx_id的条目时,才会通过return返回Transaction实例;如果整个graph遍历完都没找到目标,for循环结束后函数没有任何返回逻辑,会隐式返回单元类型(),和签名约定的返回Transaction冲突,这就是编译器提示expected struct Transaction, found ()的直接原因。 - 代码里还藏了几个会后续触发报错的问题
- 打印逻辑写错了位置:现在把"Transaction not found"的输出写在单条元素不匹配的else分支,会导致只要遍历到不符合的条目就打印提示,哪怕后面的元素能匹配上也会误报。
- 借用规则不匹配:
graph.iter()拿到的是向量元素的不可变引用,此时item.1的类型是&Transaction,就算找到匹配项也没法直接返回拥有所有权的Transaction,把返回路径补全后马上会触发新的类型报错。 - 参数声明冗余:整个函数逻辑里没有修改
graph的内容,完全不需要给参数加&mut可变借用。
修复方案
根据业务场景选对应的实现就行:
方案1:确定目标交易一定存在,找不到直接panic
适合调用方能100%保证目标tx存在的场景,遍历完没找到直接抛不可恢复错误:
// 需要拿走Transaction所有权的场景,参数按值传入,用into_iter()遍历 fn fetch_transaction (graph: Vec<(&'static str, Transaction)>, tx_id: &'static str) -> Transaction { for item in graph.into_iter() { if item.0 == tx_id { return item.1; } } panic!("Transaction not found.") }
方案2:用Option处理交易不存在的分支(推荐)
这是Rust生态最常用的错误处理方式,把"找不到交易"的逻辑交给调用方决定,不需要转移所有权时性能更好:
// 用切片&[]替代&mut Vec做参数,兼容性更强;返回Option包裹的Transaction不可变引用 fn fetch_transaction (graph: &[(&'static str, Transaction)], tx_id: &'static str) -> Option<&Transaction> { for item in graph.iter() { if item.0 == tx_id { return Some(&item.1); } } None }
调用时通过模式匹配处理两种分支即可:
match fetch_transaction(&graph, "target_tx_id") { Some(tx) => { /* 拿到交易实例后执行业务逻辑 */ } None => println!("Transaction not found.") }
内容的提问来源于stack exchange,提问作者user19316228
相关产品推荐
相关产品推荐

