Rust中的多行整数字面量

4

我有以下整数字面量:

let centre: u64 = 0b00000000_00000000_00111100_00111100_00111100_00111100_00000000_00000000;

它代表一个棋盘,所以我认为将其格式设置得更像这样会更好:
let centre: u64 = 0b
                  00000000
                  00000000
                  00111100
                  00111100
                  00111100
                  00111100
                  00000000
                  00000000;

然而,上述示例无法编译,因为我的字面量中的换行符被解释为空格。有没有办法实现这个目标?


显然不是。我的错。 - user820304
我认为目前不可能实现;但是,可以用更直接的方式表示棋盘 :)。 - ljedrz
闻起来你想要一个宏 / 半认真 - Veedrac
1个回答

5

无法像C预处理器中使用的##一样将标记拼接成新标记,Rust 1.22(标准库)中的宏也不支持此功能。

但是,我想到了以下宏。每行重复0b_,但至少可以清楚地看到零和一的模式。移位和OR在编译时计算,因此与普通文字相比,此解决方案没有运行时惩罚。

macro_rules! chessboard {
    ($line0:tt $line1:tt $line2:tt $line3:tt $line4:tt $line5:tt $line6:tt $line7:tt) => {
        ($line0 << 56) |
        ($line1 << 48) |
        ($line2 << 40) |
        ($line3 << 32) |
        ($line4 << 24) |
        ($line5 << 16) |
        ($line6 <<  8) |
        ($line7 <<  0)
    }
}

fn main() {
    let centre: u64 = chessboard!(
        0b_00000000
        0b_00000000
        0b_00111100
        0b_00111100
        0b_00111100
        0b_00111100
        0b_00000000
        0b_00000000);
    println!("{:#b}", centre);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接