我想构造一个元组并将结果的一部分分配给一个新变量,并将结果的另一部分分配给现有的.
以下代码说明了intent(这是一个导致无限循环打印的愚蠢示例[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
语句?
没有.
解构是你只能用模式做的事情; 赋值的左侧不是模式,因此您无法进行destructure-and-assign.
请参阅proto-RFC 372(解构分配),其中讨论了添加此功能的可能性.