惯用Rust方式克服上限专属范围内的溢出

时间:2017-06-04 13:49:39

标签: rust idioms idiomatic

考虑这个例子:

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 方法最多的是什么?

免责声明:这不是问题。它只是一个警告,可以在循环后使用强制转换或单个赋值轻松解决。我在问一个成语

0 个答案:

没有答案