Как включить? возможность подставить unwrap в ржавчине?

Рассмотрим следующий пример

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() , может кто-нибудь указать мне направление?

Спасибо

Почему Python в конце концов умрет
Почему Python в конце концов умрет
Последние 20 лет были действительно хорошими для Python. Он прошел путь от "просто языка сценариев" до основного языка, используемого для написания...
4
1
188
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Оператор ? работает только внутри функций, которые возвращают 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(())
}

Другие вопросы по теме