锈复合声明

时间:2014-07-05 10:16:25

标签: rust

在C语言中,你可以一次识别一堆类似的变量:

int a=1, b=2, c=3;

你怎么会生锈?我可以这样做:

let (mut a, mut b, mut c) = (1i, 2i, 3i);

但这需要多次说明muti。有没有更短的方法来做到这一点?

1 个答案:

答案 0 :(得分:5)

没有更短的方法可以做到这一点。


嗯,那不是真的。您可以定义a macro

#![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);,但parens like that are not (yet) allowed in patterns;使用尾随逗号将其扩展为let (mut _x,) = (2u,);,这是1元组,因此模式匹配正常。