在 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
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
,依此类推。
但请不要。这很令人困惑,而且与编写多个语句相比几乎没有任何好处。
一种常见的多变量赋值方式在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
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
,依此类推。
但请不要。这很令人困惑,而且与编写多个语句相比几乎没有任何好处。