if let语句中的类型不匹配:找到期望结果

时间:2016-10-21 15:15:13

标签: rust

我正在尝试解析在每个值之间具有管道分隔符的文件,并且每行都是新记录。我正在迭代每一行:

use std::fs::File;
use std::io::BufReader;
use std::io::prelude::*;

fn main() {
    let source_file = File::open("input.txt").unwrap();
    let reader = BufReader::new(source_file);
    for line in reader.lines() {
        if let Some(channel_line) = line {
            println!("yay");
        }
    }
}

Playground

然而,我收到错误:

error[E0308]: mismatched types
  --> src/main.rs:9:20
  |
9 |             if let Some(channel_line) = line {
  |                    ^^^^^^^^^^^^^^^^^^ expected enum    `std::result::Result`, found enum `std::option::Option`
  |
  = note: expected type `std::result::Result<std::string::String, std::io::Error>`
  = note:    found type `std::option::Option<_>`

这个错误令我感到困惑,因为找到的类型就是我所期望的Option<Result<String, Error>>所指出的Option,所以在假设我结果之前打开{{1}}是有意义的我不缺少什么。

1 个答案:

答案 0 :(得分:3)

您链接到next的文档,但您没有使用next(不是直接),您正在使用for循环。在for循环中,迭代变量的类型(即代码中line的类型)是迭代器的Item类型,在您的情况下是Result<String>

next的类型为Option<Item>,因为您可能会在已经到达结尾的迭代器上调用next。 for循环的主体在迭代结束后不会执行,因此迭代变量中没有任何一个选项。