来自 Rust match 语句的赋值

16

在Rust中是否有一种习语用于基于匹配条件分配变量的值?我知道类似于

val b = a match {
     case x if x % 2 == 1 => false
     case _ => true
}

我来自Scala,并想知道你是否可以在Rust中做到同样的事情。有没有一种方法可以将match子句评估为表达式并从中返回某些内容,或者它在Rust中只是一个语句?


直接引用Rust Book: 4.14 Match(第二个示例)。我建议您阅读该书(或者至少在有问题时查看它)。 - Matthieu M.
1
说实话,我觉得这个想法是可敬的,但这本书几乎没什么用处(我确实查过,但查到的是模式匹配部分,没有任何带有赋值符号的例子)。这本书非常难搜寻,也没有关键词索引。我之所以问这个问题是因为编译器给出了一条完全无关的错误信息,而我忘记了在第一个从句后面加冒号,谷歌也没有返回任何有用的信息。 - midor
@MatthieuM。像 Rust 这样有很多新事物和概念的语言中,要搜索特定的答案是很困难的。 - Fayeure
1
@Fayeure: 当然,我仍然建议阅读这本书,但完全理解只是因为某人读过它并不意味着他们记得每一条信息或者他们能够找回它。老实说,我不认为我能做到;) - Matthieu M.
2个回答

26

Rust中,几乎每个语句都是一个表达式。

你可以这样做:

fn main() {
    let a = 3;
    let b = match a {
        x if x % 2 == 1 => false,
        _ => true,
    };
}

Playground

:游乐场。

是的,谢谢,我刚弄明白了。忘记在“case”子句末尾加逗号了。一旦可以,我就会接受。 - midor

5
当然有办法:
fn main() {
    let a = 1;

    let b = match a % 2 {
        1 => false,
        _ => true
    };

    assert_eq!(b, false);
}

相关的 Rust 参考章节: 匹配表达式
尽管在您的情况下,一个简单的 if 就足够了。
let b = if a % 2 == 1 { false } else { true };

甚至更多

let b = a % 2 != 1;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接