#rust
#Ржавчина
Вопрос:
В C вы можете одновременно обрабатывать множество похожих переменных:
int a=1, b=2, c=3;
Как бы вы сделали это в rust? Я могу сделать что-то вроде:
let (mut a, mut b, mut c) = (1i, 2i, 3i);
Но это требует указания mut
и i
несколько раз. Есть ли более короткий способ сделать это?
Комментарии:
1.Это почти всегда выглядит приятнее для записи
let mut a = 1i;
let mut b = 2i;
let mut c = 3i;
.
Ответ №1:
Более короткого способа сделать это нет.
Ну, это не совсем так. Вы могли бы определить макрос:
#![feature(macro_rules)]
macro_rules! multi_mut_let {
( $( $id: ident = $value: expr ),* ) => {
let ( $( mut $id, )* ) = ($( $value, )*);
}
}
fn main() {
multi_mut_let!(a = 1i, b = 2u, c = 3f64);
a = 1;
b *= 2;
c -= 3.0;
println!("{} {} {}", a, b, c); // 2 4 0
// edge cases (which are handled fine):
multi_mut_let!();
multi_mut_let!(_x = 2u);
}
Те, у кого острый взгляд, заметят, что запятая расположена немного странно в RHS расширения макроса, поскольку это приводит к запятым в конце с обеих сторон let
. Это позволяет корректно обрабатывать второй крайний случай. Без запятой в конце оно расширяется до let (mut _x) = (2u);
, но такие скобки (пока) не разрешены в шаблонах; с запятой в конце оно расширяется до let (mut _x,) = (2u,);
, которые представляют собой 1-кортежи, и поэтому соответствие шаблону выполняется нормально.