在Rust中从if else条件中分配值的惯用法

Bob*_*Bob 6 rust

在Rust中的"if - else"构造中创建或分配几个对象之一的首选方法是什么?由于范围界定,似乎变量必须在if - else之外创建.我认为的方式都不是很好.使用字符串作为示例,这是一种方式,但它会生成有关未使用的赋值的警告:

let mut s = String::new();
if condition {
    s = "first".to_string();
} else {
    s = "second".to_string();
}
Run Code Online (Sandbox Code Playgroud)

另一种选择是:

let mut s = "second".to_string();
if condition {
    s = "first".to_string();
}
Run Code Online (Sandbox Code Playgroud)

它更短并且不会产生警告,但是意味着s被分配两次,并且意味着"second".to_string()运行但是如果condition是真的则浪费.如果不是简单的字符串创建,而是昂贵的操作(可能带有副作用),这种方法就不合适了.

还有更好的选择吗?

Ben*_*ley 14

在Rust中,if/else块是一个表达式.也就是说,块本身具有一个值,相当于执行的任何部分中的最后一个表达式.考虑到这一点,我会像这样构建你的代码:

let s = if condition {
    "first"
} else {
    "second"
}.to_string();
Run Code Online (Sandbox Code Playgroud)

  • @Christoph90:使用元组:`let (a, b) = if condition { ("first", 1) } else { ("second", 2) };` (2认同)

ten*_*dev 5

从另一个角度看待本杰明的回答可能有助于加深人们对正在发生的事情的理解。

编译器做了同样的事情,只是以另一种方式编写:

let s = String::from(if condition {
    "first"
} else {
    "second"
});

Run Code Online (Sandbox Code Playgroud)