Я хотел бы разрушить кортеж и присвоить часть результата новой переменной и назначить другую часть результата существующей.
Следующий код иллюстрирует намерение (это тупой пример, который приводит к бесконечной печати цикла [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
?