我知道一个人可以在let条语句中分解元组和其他内容:

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

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

从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"
}

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

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

推荐答案

不,这是不可能的.

It was outlined as a future possibility in the 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);
}

Rust相关问答推荐

交叉术语未正确清除屏幕

当一个箱子有自己的依赖关系时,两个人如何克服S每箱1库+n箱的限制?

为什么这是&q;,而让&q;循环是无限循环?

RUST应用程序正在退出,错误代码为:(退出代码:0xc0000005,STATUS_ACCESS_VIOLATION)

在我的Cargo 中,当我在建筑物中使用时,找不到我可以在产品包中使用的 crate .r我如何解决这个问题?

为什么TcpListener的文件描述符和生成的TcpStream不同?

异步函数返回的future 生存期

获取与父字符串相关的&;str的原始片段

Rust面向对象设计模式

Rust 中什么时候可以返回函数生成的字符串切片&str?

在 Rust 中,是否可以定义一个需要实现类型的构造函数的对象安全特征?

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

当推送到 HashMap 中的 Vector 时,类型 `()` 无法取消引用

如何在 Rust 中显式声明 std::str::Matches<'a, P> ?

在多核嵌入式 Rust 中,我可以使用静态 mut 进行单向数据共享吗?

如何使用泛型满足 tokio 异步任务中的生命周期界限

Rust 异步和 AsRef 未被发送

在 Rust 中枚举字符串的最佳方式? (字符()与 as_bytes())

如何在没有 `make_contiguous()` 的情况下对 VecDeque 进行排序或反转?

为什么 u64::trailing_zeros() 在无分支工作时生成分支程序集?