【发布时间】:2016-08-12 08:34:09
【问题描述】:
Rust Book 的Error Handling chapter 包含一个关于如何使用Option 和Result 组合子的示例。读取文件并通过应用一系列组合器将内容解析为i32 并在Result<i32, String> 中返回。
现在,当我查看代码时,我感到很困惑。在那里,在一个 and_then 的闭包中,创建了一个本地 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。它被创建并稍后在map 组合器中引用,该组合器应用于std::io::Result<usize> 返回值Read::read_to_string。
问题:我认为 not 用move 标记关闭会默认借用任何引用的值,这会导致借用检查器抱怨contents 的寿命不够长。但是,这段代码编译得很好。这意味着,Stringcontents 被移入并随后移出闭包。为什么在没有明确的move 的情况下这样做?
【问题讨论】: