enum Result<T, E> {
	Ok(T),
	Err(E),
}

? 操作符

对比

use std::io;
use std::io::Read;
use std::fs::File;

fn read_username_from_file() -> Result<String, io::Error> {
		let f = File::open("hello.txt");

		let mut f = match f {
				Ok(file) => file,
				Err(e) => return Err(e),
		};

		let mut s = String::new();

		match f.read_to_string(&mut s) {
				Ok(_) => Ok(s),
				Err(e) => Err(e),
		}
}

use std::io;
use std::io::Read;
use std::fs::File;

fn read_username_from_file() -> Result<String, io::Error> {
		let mut f = File::open("hello.txt")?;
		let mut s = String::new();
		f.read_to_string(&mut s)?;
		Ok(s)
}

use std::io;
use std::io::Read;
use std::fs::File;

fn read_username_from_file() -> Result<String, io::Error> {
		let mut s = String::new();
		File::open("hello.txt")?.read_to_string(&mut s)?;
		Ok(s)
}
  • ? 操作符用于返回 Result<T,E> 的表达式后面
  • ? 操作符只能用于返回 Result<T,E> 的函数内部
  • ? 操作符执行如下操作
    • 如果表达式返回 Ok 则返回 Ok 内的值,并且继续执行代码
    • 如果表达式返回 Err 则直接返回整个函数,并调用 From trait 定义的 from 函数将错误转换为返回定义的错误类型