我正在查看Rust 的文档,他们介绍了这段代码:
let guess: u32 = match guess.trim().parse() {
Ok(num) => num,
Err(_) => continue,
};
Run Code Online (Sandbox Code Playgroud)
如果解析成功,则将值num分配给guess其中,否则将执行 continue 语句,从而中断循环。
是我的问题还是这个语法有点奇怪?感觉就像我们正在执行guess = continue。我发现这种写法更自然:
match guess.trim().parse() {
Ok(num) => let guess: u32 = num,
Err(_) => continue,
};
Run Code Online (Sandbox Code Playgroud)
我理解有问题吗?我对 Rust 一无所知,所以也许对此有一个解释。
match是(就像 Rust 中的许多东西一样)一个表达式。例如,在运行时它有一个可以分配给变量的值。
continue是一个控制语句。它导致控制流在循环的下一次迭代时恢复。如果采用该分支,则不需要值,因为将在匹配后完成的赋值永远不会执行。
如果您习惯其他有异常的编程语言,以下想法可能有助于理解这种情况......例如,在 Python 中,您可以将函数的返回值分配给变量:
value = func()
Run Code Online (Sandbox Code Playgroud)
但是,如果func引发异常,则没有返回值。不需要任何内容,因为执行会在最近的异常处理程序处继续。
continueRust 中的控制流命令(如、break或 )也发生了类似的情况return。他们基本上告诉计算机“忘记你现在在做什么,继续(或离开)循环/函数”。
有人可能会说第二种方式确实感觉更自然(这就是你在 Python 中的做法,呵呵)。然而,Rust 有非常严格的作用域规则,很难合理地定义变量guess应该存在于哪个作用域,或者如果另一个分支定义了不同的变量会发生什么。一旦你习惯了,Rust 的实现方式就会非常清晰。