我想要构造一个元组并将结果的一部分分配给一个新变量,并将结果的另一部分分配给现有。
以下代码说明了意图(它是一个导致无限循环打印[0]
的愚蠢示例):
fn main() {
let mut list = &[0, 1, 2, 3][..];
while !list.is_empty() {
let (head, list) = list.split_at(1);
// An obvious workaround here is to introduce a new variable in the above
// let statement, and then just assign it to list.
println!("{:?}", head);
}
}
此代码创建一个新变量list
,而不是重新分配它。
如果我将代码更改为以下内容(以避免引入新let
变量的list
),则无法编译:
fn main() {
let mut list = &[0, 1, 2, 3][..];
while !list.is_empty() {
let head;
(head, list) = list.split_at(1);
println!("{:?}", head);
}
}
编译错误:
error[E0070]: invalid left-hand side expression
--> src/main.rs:5:9
|
5 | (head, list) = list.split_at(1);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ left-hand of expression not valid
有没有办法做到这一点,或者只能在let
,match
和for
声明中使用解构?
答案 0 :(得分:16)
没有
解构是你只能用模式做的事情;赋值的左侧是不模式,因此您无法进行结构化和赋值。
请参阅proto-RFC 372 (Destructuring assignment),其中讨论了添加此功能的可能性。
答案 1 :(得分:1)
Nightly Rust拥有feature(destructuring_assignment)
,可让您尝试按原样进行编译:
CPLEX
#![feature(destructuring_assignment)]
fn main() {
let mut list = &[0, 1, 2, 3][..];
while !list.is_empty() {
let head;
(head, list) = list.split_at(1);
println!("{:?}", head);
}
}
但是,我将使用切片模式匹配之类的稳定功能来解决此问题,从而避免了对[0]
[1]
[2]
[3]
和split_at
进行双重检查的需要:
is_empty
另请参阅: