Rust中if-else条件赋值的惯用方法

Rust中if-else条件赋值的惯用方法,rust,Rust,在Rust中,在“if-else”构造中创建或将多个对象之一指定给变量的首选方法是什么?由于作用域,似乎必须在if-else之外创建变量。我想到的两种方法都不太好。以字符串为例,这里有一种方法,但它会生成有关未使用的分配的警告: let mut s = String::new(); if condition { s = "first".to_string(); } else { s = "second".to_string(); } 另一种选择是: let mut s = "s

在Rust中,在“if-else”构造中创建或将多个对象之一指定给变量的首选方法是什么?由于作用域,似乎必须在if-else之外创建变量。我想到的两种方法都不太好。以字符串为例,这里有一种方法,但它会生成有关未使用的分配的警告:

let mut s = String::new();
if condition {
    s = "first".to_string();
} else {
    s = "second".to_string();
}
另一种选择是:

let mut s = "second".to_string();
if condition {
    s = "first".to_string();
}
它较短并且不会生成警告,但表示
s
被分配了两次,并表示
“秒”。to_string()
运行,但如果
条件为true,则会浪费。如果不是简单的字符串创建,而是昂贵的操作(可能有副作用),那么这种方法就不合适了


有更好的选择吗?

在Rust中,if/else块是一个表达式。也就是说,块本身有一个值,相当于执行的任何部分中的最后一个表达式。考虑到这一点,我将如下构造您的代码:

let s = if condition {
    "first"
} else {
    "second"
}.to_string();

谢谢-我想我已经看到了前面提到的,但还没有理解它的意义。@Bob:if
match
是表达式的事实确实减少了需要可变变量的情况,全心全意地接受它:)我已经看到了类似if let p=fun(){}else{在if条件内赋值的目的是什么?如何将其推广到基于相同条件赋值两个或多个变量?为每个赋值重复if块肯定不是答案。@Christoph90:使用元组:
let(a,b)=if条件{(“第一”,1)}else{(“第二”,2)}