【问题标题】:Idiomatic way of assigning a value from an if else condition in Rust从 Rust 中的 if else 条件赋值的惯用方法
【发布时间】:2019-01-02 01:11:12
【问题描述】:

在 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 被分配了两次,这意味着"second".to_string() 运行但如果condition 为真则被浪费。如果不是简单的字符串创建,而是这些昂贵的操作(可能有副作用),那么这种方法就不合适了。

有更好的选择吗?

【问题讨论】:

    标签: rust


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢 - 我想我之前已经看到过,但没有意识到它的重要性。
    • @Bob:ifmatch 是表达式这一事实确实减少了需要可变变量的情况,全心全意地接受它:)
    • 我见过像 if let p = fun() { } else {} 这样的条件,在 if 条件内进行赋值的目的是什么?
    • 这将如何推广到基于相同条件分配两个或多个变量?为每个作业重复 if 块肯定不是答案。
    • @Christoph90:使用元组:let (a, b) = if condition { ("first", 1) } else { ("second", 2) };
    猜你喜欢
    • 2012-10-03
    • 2018-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-05
    • 1970-01-01
    • 2019-09-19
    相关资源
    最近更新 更多