《Rust Book》的错误处理章节中有一个关于如何使用
当我查看代码时感到困惑。在一个闭包中,一个本地
我所指的值是
Option
和Result
组合子的示例。文件被读取并通过一系列组合子的应用将其内容解析为i32
,并以Result<i32,String>
返回。当我查看代码时感到困惑。在一个闭包中,一个本地
String
值被创建,随后作为返回值传递给另一个组合器。以下是代码示例:use std::fs::File;
use std::io::Read;
use std::path::Path;
fn file_double<P: AsRef<Path>>(file_path: P) -> Result<i32, String> {
File::open(file_path)
.map_err(|err| err.to_string())
.and_then(|mut file| {
let mut contents = String::new(); // local value
file.read_to_string(&mut contents)
.map_err(|err| err.to_string())
.map(|_| contents) // moved without 'move'
})
.and_then(|contents| {
contents.trim().parse::<i32>()
.map_err(|err| err.to_string())
})
.map(|n| 2 * n)
}
fn main() {
match file_double("foobar") {
Ok(n) => println!("{}", n),
Err(err) => println!("Error: {}", err),
}
}
我所指的值是
contents
。它是在应用于Read::read_to_string
的std::io::Result<usize>
返回值的map
组合器中创建和引用的。
问题是:我认为不使用move
标记闭包会默认借用任何引用的值,这将导致借用检查器抱怨contents
的生命周期不够长。然而,这段代码编译得非常好。这意味着String
contents
被移动到闭包中,随后又被移出。为什么可以不使用显式的move
?