2016-10-21 29 views
3

我試圖解析都有每個值之間的豎線分隔符文件,每一行是一個新的記錄。我遍歷每一行是這樣的:不匹配的類型,如果讓語句:發現選項預期的結果

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>>docs所示,所以假設我沒有遺漏某些東西,在結果之前打開Option是合理的。

回答

3

您鏈接到next的文檔,但您沒有使用next(不是直接),您正在使用for循環。在迭代變量的for循環的類型(即line在代碼的類型)是Item類型的迭代器,而你的情況是Result<String>的。

next的類型是Option<Item>,因爲您可能會在已達到結尾的迭代器上調用next。 for循環的主體不會在迭代結束後執行,因此迭代變量沒有任何意義。

+0

感謝,由於某種原因,我是不正確的信念,即for循環直接利用接下來的作用下。 – rpiper

+2

@rpiper * for循環直接利用'next'函數* - 是的,它在內部使用'next'。它處理'Some'或'None'的情況,當'Some'執行正文並且退出'None'時的循環。 – Shepmaster

+3

@rpiper它是,但它更多地沿着「如果下一個返回Some(x)將'x'賦值給循環變量,否則結束循環」。 – sepp2k

相關問題