我有一个ASCII字符串切片,当我看成字节时,我需要计算所有字符的总和。
let word = "Hello, World";
let sum = word.as_bytes().iter().sum::<u8>();
我需要指定总和的类型,否则Rust将无法编译。问题是u8
的类型太小,如果总和溢出,程序将惊慌。
我想避免这种情况,但是当使用u16
时,我找不到一种方法来指定更大的类型,例如u32
或sum()
。
我可能会尝试使用fold()
,但是我想知道是否可以通过指定其他类型来使用sum()
。
let sum = word.as_bytes().iter().fold(0u32, |acc, x| acc + *x as u32);
答案 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>;
}