我正在寻找 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 中正在发生类似的事情,控制流命令如 continue
、break
或 return
。他们基本上告诉计算机“忘记你现在正在做什么,继续(或离开)循环/函数”。
有人可能会争辩说第二种方式确实感觉更自然(这就是您在 Python 中的做法,呵呵)。然而,Rust 有非常严格的范围规则,很难明智地定义 guess
变量应该存在的范围,或者如果另一个分支定义了不同的变量会发生什么。一旦您习惯了,在 Rust 中完成它的方式就会非常清楚。