gpt4 book ai didi

rust - 在函数中返回由 serde_json 创建的结构

转载 作者:行者123 更新时间:2023-11-29 07:58:08 27 4
gpt4 key购买 nike

我被困在看似简单的问题上。我明白为什么我看到错误但似乎无法解决它。显然我遗漏了一些基本的东西。

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()等,但仍然无法正常工作。

我已经在这里搜索了所有问题,阅读了这本书等,但我仍然不清楚如何解决这个问题...任何指点将不胜感激。

最佳答案

在不了解您的项目的更多信息的情况下(下次请生成 MCVE),我会说您可以将 .iter() 调用更改为 .into_iter()。我没有收集到 Vec 然后使用 get,而是直接使用迭代器:

let m = data.deploy_info.value.into_iter().filter(|&x| x.app == "myapp").fuse();

match (m.next(), m.next()) {
(None, None) => Err(Error::NoDeployInfo),
(Some(x), None) => Ok(x),
(Some(_), Some(_)) => Err(Error::MultipleDeployInfo),
(None, Some(_)) => panic!("Iterator::fuse broken"),
}

关于rust - 在函数中返回由 serde_json 创建的结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42644319/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com