我正在研究AOC以学习Rust,并一直在努力根据我看到的更有经验的Rust程序员编写的内容拼凑出一个解决方案.
除了.sum()有问题外,下面的代码似乎完全可以编译.编译器指出,就在求和运算之前,Iterator::Item
更改为Result<usize, _>
.
不过,我不知道如何才能不使用get_priority
中的结果类型.就我所知,sum可以在迭代器上工作,但它不会将结果类型视为迭代器?
fn main() {
let data = fs::read_to_string("data/data.txt").expect("File should exist");
let lines = data.lines(); // this is an iterator of lines (type &str)
let result: usize = lines.map(|rucksack| {
let (cmprt1, cmprt2) = rucksack.split_at(rucksack.len() / 2);
let cmprt1: ByteSet = cmprt1.into();
let cmprt2: ByteSet = cmprt2.into();
let dup = cmprt1.intersection(cmprt2).first().ok_or("Error finding intersection")?;
Ok(get_priorty(dup)?)
}).sum();
println!("{}", result)
}
fn get_priorty(letter: u8) -> Result<usize, Box<dyn Error>>{
match letter {
b'a'..=b'z' => Ok(1 - (letter + b'a') as usize),
b'A'..=b'Z' => Ok(27 - (letter + b'A') as usize),
_ => Err("Unexpected character in rucksack".into())
}
}
错误消息
10 | let result: usize = lines.map(|rucksack| {
| _______________________________^
11 | | let (cmprt1, cmprt2) = rucksack.split_at(rucksack.len() / 2);
12 | | let cmprt1: ByteSet = cmprt1.into();
13 | | let cmprt2: ByteSet = cmprt2.into();
14 | | let dup = cmprt1.intersection(cmprt2).first().ok_or("Error finding intersection")?;
15 | | Ok(get_priorty(dup)?)
16 | | }).sum();
| |______^ `Iterator::Item` changed to `Result<usize, _>` here
note: required by a bound in `std::iter::Iterator::sum`