我可以在不将结果绑定到let / match / for语句中的新变量的情况下构造元组吗?

时间:2015-12-16 05:10:25

标签: rust

我想要构造一个元组并将结果的一部分分配给一个新变量,并将结果的另一部分分配给现有。

以下代码说明了意图(它是一个导致无限循环打印[0]的愚蠢示例):

fn main() {
    let mut list = &[0, 1, 2, 3][..];
    while !list.is_empty() {
        let (head, list) = list.split_at(1);
        // An obvious workaround here is to introduce a new variable in the above
        // let statement, and then just assign it to list.
        println!("{:?}", head);
    }
}

此代码创建一个新变量list,而不是重新分配它。

如果我将代码更改为以下内容(以避免引入新let变量的list),则无法编译:

fn main() {
    let mut list = &[0, 1, 2, 3][..];
    while !list.is_empty() {
        let head;
        (head, list) = list.split_at(1);
        println!("{:?}", head);
    }
}

编译错误:

error[E0070]: invalid left-hand side expression
 --> src/main.rs:5:9
  |
5 |         (head, list) = list.split_at(1);
  |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ left-hand of expression not valid

有没有办法做到这一点,或者只能在letmatchfor声明中使用解构?

2 个答案:

答案 0 :(得分:16)

没有

解构是你只能用模式做的事情;赋值的左侧是模式,因此您无法进行结构化和赋值。

请参阅proto-RFC 372 (Destructuring assignment),其中讨论了添加此功能的可能性。

答案 1 :(得分:1)

Nightly Rust拥有feature(destructuring_assignment),可让您尝试按原样进行编译:

CPLEX
#![feature(destructuring_assignment)]

fn main() {
    let mut list = &[0, 1, 2, 3][..];
    while !list.is_empty() {
        let head;
        (head, list) = list.split_at(1);
        println!("{:?}", head);
    }
}

但是,我将使用切片模式匹配之类的稳定功能来解决此问题,从而避免了对[0] [1] [2] [3] split_at进行双重检查的需要:

is_empty

另请参阅: