范围在我可以返回之前破坏值(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)的主要内容,如果未能解决你的问题,请参考以下文章

rust单元类型

Rust语言圣经31 -返回值Result和?

Rust学习教程31 -返回值Result和?

Rust学习教程31 -返回值Result和?

Rust学习教程31 -返回值Result和?

是否可以在 Rust 中返回借用或拥有的类型?