相关疑难解决方法(0)

Rust中的分号是否可选?

由于分号在Rust中显然是可选的,为什么,如果我这样做:

fn fn1() -> i32 {    
    let a = 1
    let b = 2
    3
}
Run Code Online (Sandbox Code Playgroud)

我收到错误:

error: expected one of `.`, `;`, `?`, or an operator, found `let`
 --> src/main.rs:3:9
  |
2 |         let a = 1
  |                  - expected one of `.`, `;`, `?`, or an operator here
3 |         let b = 2
  |         ^^^ unexpected token
Run Code Online (Sandbox Code Playgroud)

syntax rust

31
推荐指数
2
解决办法
6925
查看次数

在 Rust 中使用 return 语句和省略分号有什么区别?

我正在编写一个函数,该函数在成功(和失败)时返回 serde_json::Value。以前在 Rust 中,我一直省略分号以从函数返回数据,如下面的代码示例所示:

use serde_json::{Result, Value};
use core::result::Result as ResultCore;

fn returning_function() -> ResultCore<Value, Value> {
    let data = r#"
    {
        "status": "ok",
        "response": {
            "data": "secret message!"
         }
    }
    "#;

    match str_to_json(data) {
        Ok(json_data) => match json_data["status"].as_str() {
            Some(status_str) => {
                if status_str == "ok" {
                    Ok(json_data["response"].clone())
                }
            }
            None => eprintln!("\"status\" was not a string")
        }
        Err(error) => eprintln!("something went wrong! here's what: {}", error)
    }

    Err(serde_json::Value::Null)
}

fn str_to_json(json_data: &str) -> Result<Value> {
    Ok(serde_json::from_str(json_data)?)
}
Run Code Online (Sandbox Code Playgroud)

这是我不明白的部分:这不能编译。Rust …

return rust serde-json

6
推荐指数
2
解决办法
664
查看次数

为什么 return 表达式在不需要时使用分号?

我正在学习 Rust,我发现一些与函数混淆的东西。根据官方参考,返回表达式:

.. [is] 用关键字 return 表示。计算返回表达式将其参数移动到当前函数的输出槽中,破坏当前函数激活帧,并将控制权转移到调用者帧。

所以,这个程序有效:

fn main() {
    let current_hour = 10;
    let message = get_message(current_hour);

    println!("Good {0}", message);
}

fn get_message(current_hour: i32) -> &'static str {

    if current_hour < 11 {
        return "Morning"
    }
    else if current_hour < 17 {
        return "Afternoon"
    }
    else {
        return "Evening"
    }

}
Run Code Online (Sandbox Code Playgroud)

当我在“返回”表达式中添加分号时,它仍然有效:

fn main() {
    let current_hour = 10;
    let message = get_message(current_hour);

    println!("Good {0}", message);
}

fn get_message(current_hour: i32) -> &'static str {

    if current_hour …
Run Code Online (Sandbox Code Playgroud)

rust

5
推荐指数
1
解决办法
1662
查看次数

如何静态断言函数末尾无法到达

我在函数末尾有一个相当复杂的match语句(带有嵌套等)。ifthis 的每个分支都应该显式地从函数返回,或者调用某个-> !函数(例如process::exit)。

为了与其他程序员进行通信,并保护自己免受自己的伤害,我想告诉编译器断言此后的任何内容match都是无法访问的。我知道它知道如何静态地执行此操作,因为如果我将代码放在那里,我会收到编译时警告。

我尝试过的两件事:

  1. match语句分配给let _: ! = match .... 然而,这!仍然是实验性的,所以这不起作用

  2. 将其包裹match在封口中move || -> ! { match ... }();return但是,这限制了我只能从父函数中进行操作。


我的情况的具体细节不一定适用于一般情况:

  • 有问题的函数是fn main() -> ()
  • 条件逻辑必须要么分支到()返回函数,要么分支到!返回函数
  • 如果不这样做,则表明错误未正确处理或报告的路径
  • return条件逻辑中的 -ing 函数需要使用由匹配项展开的值

rust

1
推荐指数
1
解决办法
871
查看次数

标签 统计

rust ×4

return ×1

serde-json ×1

syntax ×1