我遇到了一个看似简单的问题。我知道为什么会出现错误,但似乎无法解决。显然我缺少一些基本的东西。
fn terraform_deploy_info<'a>(app: &'a MyApp) -> std::result::Result<&MyAppDeployInfo, Error> {
let terraform = process::Command::new("terraform")
// We are querying output values.
.arg("output")
// We want it in json format for easy processing.
.arg("-json")
.output()
.expect("failed to execute terraform");
let output = String::from_utf8_lossy(&terraform.stdout);
let data: TerraformOutputs = serde_json::from_str(&output).unwrap();
let m = data.deploy_info.value.iter().filter(|&x| x.app == "myapp").collect::<Vec<_>>();
if m.len() > 1 {
return Err(Error::MultipleDeployInfo);
}
match m.get(0) {
Some(&x) => Ok(x),
None => Err(Error::NoDeployInfo),
}
}
我收到的错误是:
borrowed value must be valid for the lifetime 'a as defined on the body at
这对我来说很有道理,因为我在函数中创建结构并返回一个借用引用,当然,当函数结束时它就会消失。
但是,当我将返回类型更改为std::result::Result<MyAppDeployInfo, Error>
(即不返回引用)时,我似乎无法让Ok(x)
正常工作...我收到了一个错误:
expected struct `MyAppDeployInfo`, found reference
再次说明,这是有道理的,因为serde_json
创建一个结构,然后我通过引用进行迭代,所以当我索引集合时,我在查看一个引用。
因此,我尝试了各种方法来获取结构值,如解除引用、Box::new
、clone()
、to_owned()
等,但仍无法使其正常工作。
我已在这里搜索了所有问题,阅读了书籍等,但我仍不清楚如何解决这个问题...任何指针都将不胜感激。
into_iter()
而不是使用collect()
是我之前遗漏的。现在它可以正常工作了。 - Chris