在解构赋值中使用一些现有的绑定

Flo*_*ker 4 rust

我知道可以在let语句中解构元组和其他内容:

fn foo() -> (u8, u8) {
    (1, 2)
}

fn main() {
    let (x, y) = foo();
    println!("{}, {}", x, y);  // prints "1, 2"
}
Run Code Online (Sandbox Code Playgroud)

从 Rust 1.59 开始,我们还可以重用现有的绑定:

fn main() {
    let mut x = 0;
    let mut y = 0;
    println!("{}, {}", x, y);  // prints "0, 0"
    (x, y) = foo();
    println!("{}, {}", x, y);  // prints "1, 2"
}
Run Code Online (Sandbox Code Playgroud)

我想知道是否有一种方法可以混合两者,即为模式中的某些变量重新使用现有的绑定,并为其他变量创建新的绑定。类似于以下内容(无法编译):

fn main() {
    let mut x = 0;
    println!("{}", x);
    (x, let y) = foo();
    println!("{}, {}", x, y);
}
Run Code Online (Sandbox Code Playgroud)

Cha*_*man 5

不,这是不可能的。

它在 RFC 中被概述为未来的可能性,并在此后进行了多次讨论,但 RFC 既没有实施也没有实施。

有两种解决方法:要么使用let声明所有变量并在其后赋值,要么let在赋值之前使用:

// Either:
fn main() {
    let mut x = 0;
    println!("{}", x);
    let y;
    (x, y) = foo();
    println!("{}, {}", x, y);
}

// Or:
fn main() {
    let mut x = 0;
    println!("{}", x);
    let (x2, y) = foo();
    x = x2;
    println!("{}, {}", x, y);
}
Run Code Online (Sandbox Code Playgroud)