if let 与布尔表达式绑定

Wal*_*ari 3 rust

以前可能有人问过这个问题,但我找不到任何东西..

在 Go 中,你可以做这样的事情

v1 := 3
v2 := 4

if v := v1 - v2; v < 4 {
   // use v 
} 
Run Code Online (Sandbox Code Playgroud)

在 Rust 中,我找不到用if let绑定来做到这一点的方法

let v1 = 3;
let v2 = 4;

// able to match an exact value
if let v @ 4 = v1 - v2 {}

// but unable to match a range of value like in a `match` block
if let v @ (0..4) = v1 - v2 {} 
if let v (if v < 4) = v1 - v2 {}

Run Code Online (Sandbox Code Playgroud)

当然,声明v外部有效,但有点尴尬,因为它仅在if块中使用

Sil*_*olo 6

对此作出回应

当然,在外部声明 v 是可行的,但有点尴尬,因为它仅在if块中使用

在 Rust 中,您可以随时创建显式块。考虑

// Some code ...
{
  let v = v1 - v2;
  if v < 4 {
    ...
  }
}
// Some more code ... (v doesn't exist down here anymore)
Run Code Online (Sandbox Code Playgroud)

如果您担心的是局部变量的作用域太大(这是一个合理的担忧),那么您可以创建一个显式块来指示作用域何时结束,以便借用检查器和人类读者都清楚地知道超出该点后不再使用变量。


Cha*_*man 5

您的第一次尝试很好,只是独占范围模式 ( ..) 是实验性的。您可以使用包含模式 ( ..=) 来代替:

if let v @ 0..=3 = v1 - v2 {}
Run Code Online (Sandbox Code Playgroud)

Guards( if ...) 不可用于if let,但您可以使用match

match v1 - v2 {
    v if v < 4 => {}
    _ => {}
}
Run Code Online (Sandbox Code Playgroud)