如何对一片字节求和以减少溢出的可能性

时间:2018-11-12 20:25:41

标签: string rust sum byte slice

我有一个ASCII字符串切片,当我看成字节时,我需要计算所有字符的总和。

let word = "Hello, World";
let sum = word.as_bytes().iter().sum::<u8>();

我需要指定总和的类型,否则Rust将无法编译。问题是u8的类型太小,如果总和溢出,程序将惊慌。

我想避免这种情况,但是当使用u16时,我找不到一种方法来指定更大的类型,例如u32sum()

我可能会尝试使用fold(),但是我想知道是否可以通过指定其他类型来使用sum()

let sum = word.as_bytes().iter().fold(0u32, |acc, x| acc + *x as u32);

1 个答案:

答案 0 :(得分:5)

您可以使用"Yes"将每个字节转换为更大的类型:

[poc_inr not needed]

"No"

您无法用原始尝试求和到map的原因是提供它的Sum trait具有以下定义:

let sum: u32 = word.as_bytes().iter().map(|&b| b as u32).sum();

这意味着其方法let sum: u32 = word.as_bytes().iter().cloned().map(u32::from).sum(); 默认情况下返回与其构建迭代器的项目相同的类型。您可以通过查看implementation of Sum来了解u32的情况:

pub trait Sum<A = Self> {
    fn sum<I>(iter: I) -> Self
    where
        I: Iterator<Item = A>;
}