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

下面的代码说明了其意图(这是一个导致无限循环的愚蠢示例):

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,而不是重新分配它.

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

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 of assignment
 --> src/main.rs:5:22
  |
5 |         (head, list) = list.split_at(1);
  |         ------------ ^
  |         |
  |         cannot assign to this expression
  |

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

推荐答案

解构是你只能用模式来做的事情;赋值的左边是not a模式,因此不能分解和赋值.

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

Rust相关问答推荐

if let声明中临时对象的生存期

如何初始化match声明中的两个变量而不会激怒borrow 判断器?

Rust,polars CSV:有没有一种方法可以从impll BufRead(或任何字节迭代器)中读取CSV?

重新导出proc宏导致未解决的extern crate错误""

程序退出后只写入指定管道的数据

如何在tauri—leptos应用程序中监听后端值的变化?""

如何将`Join_all``Vec<;Result<;Vec<;Foo&>;,Anywhere::Error&>;`合并到`Result<;Vec<;Foo&>;,Anywhere::Error&>;`

rust 迹-内存管理-POP所有权-链表

默认特征实现中的生命周期问题

在复制类型中使用std::ptr::WRITE_VILAR进行内部可变性的安全性(即没有UnSafeCell)

在Rust内联程序集中使用字符串常量

为什么AsyncRead在Box上的实现有一个Unpin特征绑定?

Rust 中多个 & 符号的内存表示

在 Rust 中忽略 None 值的正确样式

为什么Rust编译器会忽略模板参数应具有静态生命周期?

Rust typestate 模式:实现多个状态?

分配给下划线模式时会发生什么?

Rust 中的方法调用有什么区别?

是否可以在 Rust 中的特定字符上实现特征?

使用部分键从 Hashmap 中检索值