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

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

另一种 Select 是:

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

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

还有更好的 Select 吗?

推荐答案

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

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

Rust相关问答推荐

关联类型(类型参数)命名约定

如何装箱生命周期相关联的两个对象?

如果A == B,则将Rc A下推到Rc B

在Rust中赋值变量有运行时开销吗?

在决定使用std::Sync::Mutex还是使用Tokio::Sync::Mutex时,操作系统线程调度是考虑因素吗?

是否可以使用Rust宏来构建元组的项?

为昂贵的for循环制作筛子

在0..1之间将U64转换为F64

为什么`AlternateScreen`在读取输入键时需要按Enter键?

如何在嵌套的泛型 struct 中调用泛型方法?

在铁 rust 中,如何一次只引用几件事中的一件?

用于实现获取 struct 体 id 的特征规范

在为第三方 struct 实现第三方特征时避免包装器的任何方法

为什么 Rust 需要可变引用的显式生命周期而不是常规引用?

Rust LinkedList 中的borrow 判断器错误的原因是什么?

需要一个有序向量来进行 struct 初始化

有没有办法隐式绑定 let/match 操作的成员?

为什么在 macOS / iOS 上切换 WiFi 网络时 reqwest 响应会挂起?

改变不实现克隆的 dioxus UseState struct

如何在 Rust 中编写涉及异步的重试函数