Rust 如何迭代所有字节值(溢出'0..256'中的\u文字)

Rust 如何迭代所有字节值(溢出'0..256'中的\u文字),rust,Rust,我试图迭代所有可能的字节(u8)值。不幸的是,0..256中的我的范围文本被强制转换为u8和256溢出: 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);

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

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.");
    }
}
以上内容包括:

警告:u8的文字超出范围
-->src/main.rs:6:20
|
6 |表示0..256中的字节{
|                    ^^^
|
=注意:#[警告(溢出的_文本)]默认打开
第一个循环体根本不会执行

我的工作环境非常难看,而且由于演员阵容的原因,感觉很脆弱:

for short in 0..256 {
    let _explicit_type: u16 = short;
    foo(short as u8);
}
有更好的办法吗?

这是个问题

其要点是,
字节
被推断为
u8
,因此
0..256
被表示为
范围
,但不幸的是
256
溢出为
u8

当前的解决方法是使用更大的整数类型并稍后转换为
u8
,因为实际上从未达到
256


有一个已进入最后评论期的;将来可能会有
用于0…255中的字节或其替代
(0…255)。inclusive()
从Rust 1.26开始,inclusive范围使用语法
。=
,因此您可以这样写:

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

对于初学者来说,你可以在0..256
中丢失
explicitType
并为i编写
,只要你在
foo(i作为u8)
中进行转换。然后
i
将是
i32
类型。不过这只是稍微好一点。@delnan:你的提示让我想到了
(0..256).map(| byte | byte作为u8)
,它同样不直观,但至少向读者指出了它的神奇之处。但它仍然不好:(现在有一个开放的实现此功能。谢谢!奇怪的是,这样一个常见的情况需要一个相对新的符号。语法最终引发了最长的争论,它花了一段时间来解决
。=
,而不是
或其他东西。