在 Rust 的一行中为多个变量分配一个值?

Assign a single value to multiple variables in one line in Rust?

一种常见的多变量赋值方式在C或Python等编程语言中常表示为:

a = b = c = value;

Rust 中是否有与此等效的内容,或者您​​需要将其写出来吗?

a = value;
b = value;
c = value;

抱歉,如果这很明显,但我的所有搜索都会导致有关元组分配的问答。

不,没有等效项。是的,您必须编写多个赋值,或者编写一个 本身 执行多个赋值的宏。

在 Rust 中,表达式 a = b = c = value;a = (b = (c = value));

相同

(x = ...) returns ()。然后,第一个表达式等效于以下内容:

c = value;
b = ();
a = ();

注意表达式最后有一个分号,但是如果表达式在最后一行作为函数的 return 像这样 a = b = c = value,等价的将是:

c = value;
b = ();
a = () // without the semicolon

不能将赋值结果链接在一起。但是,您可以用一条语句分配多个变量。

let statement, you can bind multiple names by using an irrefutable pattern左边赋值:

let (a, b) = (1, 2);

(Since Rust 1.59,您还可以在任何赋值的左侧有多个值,而不仅仅是 let 语句。)

为了给多个变量赋同一个值而不重复取值,可以在右边使用一个slice pattern as the left-hand side of the assignment, and an array expression来重复取值,如果实现了Copy:

let value = 42;
let [a, b, c] = [value; 3]; // or: let [mut a, mut b, mut c] = ...
println!("{} {} {}", a, b, c); // prints: 42 42 42

(Playground)

使用const generics

fn main() {
    let [a, b, c] = fill_new_slice(1);
    dbg!(a, b, c);
}

fn fill_new_slice<T: Copy, const N: usize>(value: T) -> [T; N] {
    [value; N]
}
$ cargo run --quiet
[src/main.rs:3] a = 1
[src/main.rs:3] b = 1
[src/main.rs:3] c = 1

其实,你完全可以做到!

let a @ b @ c = value;

这使用模式中的@语法,用于将值绑定到变量,但保持模式匹配。因此,这会将 value 绑定到 a(通过复制),然后继续匹配模式 b @ c,后者将 value 绑定到 b,依此类推。

但请不要。这很令人困惑,而且与编写多个语句相比几乎没有任何好处。