这个问题在这里已有答案:
请考虑以下示例
use std::fs::File;
use std::io::{BufRead, BufReader, Result};
fn main() {
let file = File::open("myfile.txt")?; // This doesn't work
let file = File::open("myfile.txt").unwrap(); // this works
for line in BufReader::new(file).lines() {
println!("{}", line.unwrap());
}
}
使用rustc 1.33.0 (2aa4c46cf 2019-02-28)
我正在尝试使用?
来代替展开,但似乎我总是得到^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ cannot use the
?operator in a function that returns
()
,有人可以指点我的方向吗?
谢谢
?
运算符仅在返回Result<T, E>
的函数内部工作,因为expr?
基本上与以下内容相同:
match expr {
Ok(value) => value,
Err(err) => return Err(err),
}
您可以修改main()
函数以返回结果。使用Result<(), Box<dyn std::error::Error>>
将允许您在任何实现?
特征的标准错误类型上使用Error
:
use std::error::Error;
use std::fs::File;
use std::io::{BufRead, BufReader};
fn main() -> Result<(), Box<dyn Error>> {
let file = File::open("myfile.txt")?; // this will now work
for line in BufReader::new(file).lines() {
println!("{}", line?);
}
// finally, we need to end with Ok(()) since we no longer have
// the default return type ()
Ok(())
}