Рассмотрим следующий пример
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(())
}