如何修正代码以避免错误:
'a', 'b' -- is borrowed here
returns a value referencing data owned by the current function
?
use std::collections::HashMap;
#[derive(Debug)]
struct Error;
fn f1(s: &str) -> Result<&str, Error> {
// something for test:
if s.len() > 5 {
Ok(s)
}else{
Err(Error)
}
}
fn f2(s: &str) -> Result<&str, Error> {
todo!()
}
fn r(raw: HashMap<String, String>) -> Result<HashMap<&'static str, &'static str>, Error> {
raw
.into_iter()
.map(|(a, b)| {
// println!("{:?} - {:?}", a, b);
Ok((
f1(&a)?,
f2(&b)?,
))
})
.collect()
}
fn main() {
let raw: HashMap<String, String> = HashMap::from([
("Mercury".to_string(), "0.4".to_string()),
("Venus".to_string(), "0.7".to_string()),
("Earth".to_string(), "1.0".to_string()),
("Mars".to_string(), "1.5".to_string()),
]);
println!("{:?}", r(raw));
}
如果编译器建议使用生命周期
'static
,那么很有可能你做错了什么,只是没有找到更好的建议来修复错误。这里的情况在很多方面与这个相当明显的错误相似
即使不考虑我们试图返回对局部变量的引用,问题也会出现在函数签名中的结果生存期的输出中。如果函数参数也是通过引用传递的,那么根据生存期省略规则,编译器也会将此引用的生存期用于结果。在这种情况下,您需要明确指定生存期,而他知道的唯一合适的选项是
'static
,但他诚实地承认这不太可能是您所需要的。没错,对于这个简单的例子,他还将提供更合乎逻辑的选择
甚至两个
甚至在更复杂的情况下
能够提供适当的解决方案
但他也不是万能的,在这里他只会提出一个建议
'static
我将更正后的代码从评论复制到了问题中