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

时间:2016-08-07 04:51:05

标签: rust syntactic-sugar

分配多个变量的常用方法通常用C或Python等编程语言表示为:

a = b = c = value;

在Rust中是否有相同的内容,或者你需要写出来吗?

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

如果这是显而易见的道歉,但我的所有搜索都会导致Q& A关于元组分配。

4 个答案:

答案 0 :(得分:8)

不,没有等价物。是的,您必须编写多个作业,或编写本身进行多项作业的宏。

答案 1 :(得分:1)

作为DK。正确回答,您不能将作业的结果链接在一起。但是,您可以用一条语句为多个变量赋值。

在一个 let statement 中,您可以使用赋值左侧的 irrefutable pattern 绑定多个名称:

let (a, b) = 1, 2;

您可以使用 slice pattern 作为赋值的左侧,并在右侧使用 array expression 来重复该值,如果它实现了 Copy:

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

(Playground)

您目前无法在非let 赋值表达式中分配多个变量,但正在实施(请参阅 RFC 2909)并且可能在不久的将来稳定下来。

答案 2 :(得分:1)

使用 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

答案 3 :(得分:0)

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

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

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

请注意,表达式的末尾有一个分号,但如果表达式在最后一行作为函数的返回值,如 a = b = c = value,则等效如下:

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