如何迭代所有字节值(`0..256`中的overflowing_literals)

时间:2015-08-30 12:08:54

标签: rust

我试图迭代所有可能的字节(u8)值。不幸的是,0..256中的范围文字会转换为u8256溢出:

fn foo(byte: u8) {
    println!("{}", byte);
}

fn main() {
    for byte in 0..256 {
        foo(byte);
        println!("Never executed.");
    }
    for byte in 0..1 {
        foo(byte);
        println!("Executed once.");
    }
}

以上编译:

warning: literal out of range for u8
 --> src/main.rs:6:20
  |
6 |     for byte in 0..256 {
  |                    ^^^
  |
  = note: #[warn(overflowing_literals)] on by default

根本不会执行第一个循环体。

我的解决方法非常难看,因为演员而感觉很脆弱:

for short in 0..256 {
    let _explicit_type: u16 = short;
    foo(short as u8);
}

有更好的方法吗?

2 个答案:

答案 0 :(得分:5)

这是问题Unable to create a range with max value

它的要点是byte被推断为u8,因此0..256表示为Range<u8>但不幸的是256溢出为{的{1}}。

目前的变通方法是使用更大的整数类型,然后在u8之后投射到u8,因为256实际上从未到过。

RFC for inclusive range with ...已进入最终评论期;也许将来有可能拥有for byte in 0...255或其替代(0..255).inclusive()

答案 1 :(得分:4)

从Rust 1.26开始,使用语法..=来稳定包含范围,因此您可以将其写为:

for byte in 0..=255 {
    foo(byte);
}