【发布时间】:2016-12-13 03:39:30
【问题描述】:
分配多个变量的常用方法在 C 或 Python 等编程语言中通常表示为:
a = b = c = value;
Rust 中是否有等价物,还是需要写出来?
a = value;
b = value;
c = value;
抱歉,如果这很明显,但我所有的搜索都会导致关于元组分配的问答。
【问题讨论】:
-
我不相信有。
标签: rust syntactic-sugar
分配多个变量的常用方法在 C 或 Python 等编程语言中通常表示为:
a = b = c = value;
Rust 中是否有等价物,还是需要写出来?
a = value;
b = value;
c = value;
抱歉,如果这很明显,但我所有的搜索都会导致关于元组分配的问答。
【问题讨论】:
标签: rust syntactic-sugar
不,没有等价物。是的,你必须写多个赋值,或者写一个宏,它自己做多个赋值。
【讨论】:
a = b = c = Vec::new() 的结果是什么?
作为 DK。正确回答,您不能将分配的结果链接在一起。但是,您可以使用单个语句分配多个变量。
在let statement 中,您可以使用赋值左侧的irrefutable pattern 绑定多个名称:
let (a, b) = 1, 2;
如果它实现了 Copy,您可以使用 slice pattern 作为赋值的左侧,并在右侧使用 array expression 来重复值:
let value = 42;
let [a, b, c] = [value; 3]; // or: let [mut a, mut b, mut c] = ...
println!("{} {} {}", a, b, c);
您目前无法在非let 赋值表达式中分配多个变量,但这正在实施(请参阅RFC 2909)并且可能会在不久的将来稳定。
【讨论】:
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
【讨论】:
在 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
【讨论】:
(x = ...)返回x的值”:这是不正确的; assignment returns the unit type(即())。 Rust Playground example