Rust:带有匹配和变量绑定(bind)的奇怪语法

标签 rust

<分区>

我正在寻找 Rust's docs他们介绍这段代码的地方:

let guess: u32 = match guess.trim().parse() {
    Ok(num) => num,
    Err(_) => continue,
};

如果解析成功,值 num 被分配给 guess,否则执行 continue 语句使循环中断。

是我还是这个语法有点奇怪?感觉就像我们在执行guess = continue。我发现这种写法更自然:

match guess.trim().parse() {
    Ok(num) => let guess: u32 = num,
    Err(_) => continue,
};

我理解错了吗?我对 Rust 一无所知,所以也许对此有解释。

最佳答案

match 是(就像 Rust 中令人惊讶的许多事情一样)一个表达式。所以在运行时它有一个值,你可以分配给一个变量,例如。 continue 是一个控制语句。它会导致控制流在循环的下一次迭代中恢复。如果采用该分支,则不需要值,因为永远不会执行在匹配之后完成的赋值。

如果您习惯了其他有异常的编程语言,下面的想法可能有助于理解这种情况......例如,在 Python 中,您可以将函数的返回值分配给变量:

value = func()

但是,如果 func 引发异常,则没有返回值。不需要,因为执行会在最近的异常处理程序处继续。

Rust 中正在发生类似的事情,控制流命令如 continuebreakreturn。他们基本上告诉计算机“忘记你现在正在做什么,继续(或离开)循环/函数”。


有人可能会争辩说第二种方式确实感觉更自然(这就是您在 Python 中的做法,呵呵)。然而,Rust 有非常严格的范围规则,很难明智地定义 guess 变量应该存在的范围,或者如果另一个分支定义了不同的变量会发生什么。一旦您习惯了,在 Rust 中完成它的方式就会非常清楚。

关于Rust:带有匹配和变量绑定(bind)的奇怪语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71178300/

相关文章:

rust - 使用 as_slice() 时为 "borrowed value does not live long enough"

rust - `paint_evm::Event` 未针对 `Event` 实现

macros - 如何强制类型在编译时实现特征?

rust - 默认发布版本是否始终使用 SSSE3 指令?

rust - 重写函数以使用特征时借用内容时出错

docker - 复制失败的 '/target/x86_64-unknown-linux-musl/release/microservice_app: no such file or directory' Rust Dockerfile

generics - 在 Rust 中使用宏创建 impl-block 的问题

rust - 我如何使用 `rustc` 箱子?

rust - Rust 中相对向量大小调整的一行代码

struct - 同时改变多个结构字段的最快惯用方法是什么?