io - E0308 使用 reader.lines() 中的行从文件中读取行

标签 io rust

我是一名经验丰富的开发人员,目前正在尝试自学 Rust,并且正在编写一个简单的程序来从文件中读取行。我已经前后阅读了 Rust std:io、std:result 和其他文档,这段代码大部分直接取自文档。我不明白为什么下面的程序不能编译。

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

fn main() {
    File::open("./data/test")
        .map_err(|err| err.to_string())
        .and_then( |mut dataFile| { 
             let mut reader = BufReader::new(dataFile);
             for line in reader.lines() {
                println!("{}",line.unwrap());

             };                           
        });        
}

我在运行 cargo build 时收到的编译错误是

src/main.rs:10:35: 16:10 error: mismatched types:
 expected `core::result::Result<_, collections::string::String>`,
    found `()`
(expected enum `core::result::Result`,
    found ()) [E0308]
src/main.rs:10         .and_then( |mut dataFile| { 
src/main.rs:11              let mut reader = BufReader::new(dataFile);
src/main.rs:12              for line in reader.lines() {
src/main.rs:13                 println!("{}",line.unwrap());
src/main.rs:14    
src/main.rs:15              };                           
           ...
src/main.rs:10:35: 16:10 help: run `rustc --explain E0308` to see a detailed explanation
error: aborting due to previous error

我正在运行 Rust 1.4.0。

最佳答案

你不应该使用 and_then ,但是map .

正确的代码:

File::open("./data/test")
    .map_err(|err| err.to_string())
    .map(|mut dataFile| { 
         let mut reader = BufReader::new(dataFile);
         for line in reader.lines() {
            println!("{}",line.unwrap());
         };
    }); 

您可以在两个函数签名中看到它:

fn and_then<U, F: FnOnce(T) -> Result<U, E>>(self, op: F) -> Result<U, E>
fn map<U, F: FnOnce(T) -> U>(self, op: F) -> Result<U, E>

这里的主要区别在于操作 op必须返回包裹在 Result 中的东西在and_then的情况,而不必将其包装在 map 中的情况。你的闭包不返回任何东西,所以在 Rust 看来它实际上返回了 () , 和 ()无法匹配 Result<U, E> .然而()可以匹配U ,这就是第二个签名起作用的原因。

关于io - E0308 使用 reader.lines() 中的行从文件中读取行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33854702/

相关文章:

c - read(2) 如何与回车交互?

rust - 如何安全地从 `&mut [u32]` 获取不可变 byte slice ?

rust - 如何无限期地读取 Rust Tokio 任务中的无界 channel ?

visual-studio-code - rust-analyzer 无法加载工作区 : "cargo" "--version" failed: program not found

linux - 在 bash 中获取文件指针并任意读取行

java - 将字符串写入大文件

c# - 从多个线程异步写入文件c#

android - flutter : Create directory on external storage path - path provider getExternalStorageDirectory()

rust - 将带有::的参数传递给宏调用时发生编译错误

rust - 如何制作其中一个字段引用另一个字段的结构