Декларация о составе ржавчины

#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-кортежи, и поэтому соответствие шаблону выполняется нормально.