考虑这个例子:
fn main() {
let mut t: [u8; 256] = [0; 256];
for i in 0..256u8 {
t[i as usize] = i;
}
println!("{}", t[0]);
println!("{}", t[1]);
println!("{}", t[128]);
println!("{}", t[254]);
println!("{}", t[255]);
}
(code sample on play.rust-lang.org)
我想初始化包含256个无符号整数8位值的数组。初始值由第一项的0定义,并为每个连续的元素递增。
此代码不起作用。
Range
的上限是独占的,因此for循环的第一个值是0,最后一个值是255.我的数组长度为256,索引范围从第一个索引0到最后一个索引255。听起来不错,但是上限被定义为“256u8”(一个u8
),这个值在技术上是0(256 % 256 == 0
)。因此编译器警告我:
warning: literal out of range for u8
--> <anon>:3:17
|
3 | for i in 0..256u8 {
| ^^^^^
|
= note: #[warn(overflowing_literals)] on by default
克服此警告的 Rust-idiomatic 方法最多的是什么?
免责声明:这不是问题。它只是一个警告,可以在循环后使用强制转换或单个赋值轻松解决。我在问一个成语。