如何启用?替代生锈的特征? [重复]

问题描述 投票:-3回答:1

请考虑以下示例

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 theoperator in a function that returns() ,有人可以指点我的方向吗?

谢谢

rust
1个回答
2
投票

?运算符仅在返回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(())
}
© www.soinside.com 2019 - 2024. All rights reserved.