我试图迭代所有可能的字节(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.");
}
}
以上编译:
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);
}
有更好的方法吗?
答案 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);
}