范围在我可以返回之前破坏值(RUST)
Posted
技术标签:
【中文标题】范围在我可以返回之前破坏值(RUST)【英文标题】:Scopes destroy value before I can return it (RUST) 【发布时间】:2022-01-19 10:46:24 【问题描述】:我有这段代码,它本质上需要返回一个字符串。我正在迭代一个 JSON 响应,并且值(我感兴趣的字符串)在其中很深,所以我需要一个 for 循环和一个 if/else。这里的问题是这些循环的范围。我感兴趣的值在作用域结束后立即销毁,我需要返回的值变成(),因为函数返回一个
Result<String, reqwest::Error>
这就是我的意思:
pub fn get_sprint() -> Result<String, reqwest::Error>
//The code to get the JSON response works fine. I store it in the variable called `get_request`. Here's the issue I am having:
if get_request.status() == 200
let resp: Response = get_request.json()?;
for r in resp.value
if r.attributes.timeFrame == "current"
return Ok(r.name.to_string()); // THIS PLACE. I know the value is getting destroyed right after the scope ends, but I can't think of a way for it to not do that.
else
Ok(format!("Encountered error - ", get_request.status().to_string()))
当我运行上面的代码时,我得到了这个:
error[E0308]: mismatched types
--> src\getLatestSprint.rs:71:9
|
37 | pub fn get_sprint() -> Result<String, reqwest::Error>
| ------------------------------ expected `Result<std::string::String, reqwest::Error>` because of return type
...
71 | / for r in resp.value
72 | | if r.attributes.timeFrame == "current"
73 | | return Ok(r.name.to_string());
74 | |
75 | |
| |_________^ expected enum `Result`, found `()`
|
= note: expected enum `Result<std::string::String, reqwest::Error>`
found unit type `()`
For more information about this error, try `rustc --explain E0308`.
嗯,是的。我知道它需要一个结果,并得到()。我怎样才能克服这个问题?
【问题讨论】:
为什么不在for
循环结束后返回Error(blabla)?这有什么问题
至于问题:问问自己,当状态码为200,但响应值没有timeframe == "current"
的属性时,你的函数返回了什么?
我很抱歉。我删除了错误的屏幕截图并添加了文本。
【参考方案1】:
错误消息没有提到值被破坏。它说“你根本没有返回任何东西”。
您没有考虑所有可能性:如果响应代码为 200,但负载不包含timeFrame == "current"
,您的方法将不会返回任何内容。
要解决此问题,请在 for
循环之后添加 return
语句。
【讨论】:
是的,我已经做到了。为了获得正确的货物构建/运行,我有一个return Ok("blahblahblah".to_string())
,它没有帮助,但它构建/运行。但这是我遇到麻烦的 if 语句中的那个。所以在return Ok(r.name.to_string());
之后我添加了一个else语句return Ok("Timeframe Current not found".to_string());
所以现在看起来像这样:``` if r.attributes.timeFrame == "current" return Ok(r.name.to_string()) else return好的(“当前未找到”.to_string()) ```
好的,我让它工作了:``` if get_request.status() == 200 let resp: Response = get_request.json()?;对于 r 在 resp.value if r.attributes.timeFrame == "current" return Ok(r.name.to_string()); return Ok("Current not found".to_string())```
显然这不是 RUST 的事情。很长一段时间后,我才开始编程,只是因为对 RUST 的热爱。谢谢,现在可以使用了。以上是关于范围在我可以返回之前破坏值(RUST)的主要内容,如果未能解决你的问题,请参考以下文章