Nic*_*ick 4 string byte sum slice rust
我有一个ASCII字符串切片,我需要计算所有字符的总和,当看作字节.
let word = "Hello, World";
let sum = word.as_bytes().iter().sum::<u8>();
Run Code Online (Sandbox Code Playgroud)
我需要指定sum的类型,否则Rust将无法编译.问题是这u8
是一个太小的类型,如果总和溢出程序将会出现恐慌.
我想避免这种情况,但我无法找到一种方法来指定更大的类型,例如,u16
或者u32
在使用时sum()
.
我可能会尝试使用fold()
,但我想知道是否有一种方法可以sum()
通过指定另一种类型来使用.
let sum = word.as_bytes().iter().fold(0u32, |acc, x| acc + *x as u32);
Run Code Online (Sandbox Code Playgroud)
您可以使用map
将每个字节强制转换为更大的类型:
let sum: u32 = word.as_bytes().iter().map(|&b| b as u32).sum();
Run Code Online (Sandbox Code Playgroud)
要么
let sum: u32 = word.as_bytes().iter().cloned().map(u32::from).sum();
Run Code Online (Sandbox Code Playgroud)
您无法总结u32
使用原始尝试的原因是提供它的Sum
特征具有以下定义:
pub trait Sum<A = Self> {
fn sum<I>(iter: I) -> Self
where
I: Iterator<Item = A>;
}
Run Code Online (Sandbox Code Playgroud)
这意味着它的方法sum
默认返回与构建它的迭代器的项相同的类型.你可以看到它是一个与案件u8
通过观察其执行Sum
:
fn sum<I>(iter: I) -> u8
where
I: Iterator<Item = u8>,
Run Code Online (Sandbox Code Playgroud)