我正在研究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`

推荐答案

当你对类型为Result<usize, E>的项目求和时,你会得到相同类型的结果.但在这里,你试图迫使结果成为一个简单的usize.您需要:

  • 给出正确的类型let result: Result<usize, Box<dyn Error>> = lines.map(|rucksack| { … }).sum();
  • 删除类型批注并让编译器推断正确的类型:let result = lines.map(|rucksack| { … }).sum();
  • 或者处理错误:let result: usize = lines.map(|rucksack| { … }).sum().unwrap();

Rust相关问答推荐

空字符串转换为Box字符串时是否分配?<>

何时可以在Rust中退出异步操作?

在Rust中有没有办法在没有UB的情况下在指针和U64之间进行转换?

为昂贵的for循环制作筛子

为什么Deref类特征不构成?

如果变量本身不是None,如何返回;如果没有,则返回None&Quot;?

允许 rust 迹 struct 条目具有多种类型

如何在Rust中缩短数组

为什么AsyncRead在Box上的实现有一个Unpin特征绑定?

Rust 中什么时候可以返回函数生成的字符串切片&str?

如何执行数组文字的编译时串联?

tokio::spawn 有和没有异步块

Rust 文件未编译到 dll 中

缺失serde的字段无法设置为默认值

按下 Ctrl + C 时优雅地停止命令并退出进程

没有得到无法返回引用局部变量`queues`的值返回引用当前函数拥有的数据的值的重复逻辑

Rust Serde 为 Option:: 创建反序列化器

当 T 不是副本时,为什么取消引用 Box 不会抱怨移出共享引用?

我可以在不调用 .clone() 的情况下在类型转换期间重用 struct 字段吗?

如何构建包含本地依赖项的 docker 镜像?