我是一名经验丰富的开发人员,目前正在尝试自学 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/