0x999

当遇到某个方法返回 Result 类型的时候,我们可以通过 match 来判断 Result 是错误还是我们期望的结果。比如下面这个简简单单的栗子例子——打开一个 hello.txt 文件,读取它的内容打印出来

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
use std::fs::File;
use std::io::Read;
fn main() {
    let f = File::open("hello.txt");

    let mut f = match f {
        Ok(file) => file,
        Err(e) => panic!("Open file failed: {}", e),
    };

    let mut buf = String::new();

    match f.read_to_string(&mut buf) {
        Ok(size) => println!("size={}, cotent={}", size, buf),
        Err(e) => panic!("read file failed: {}", e),
    }
}

看到这里,用 golang 的同学应该已经闻到 Error handling 熟悉的味道了。天呢,为什么我们要不停的去 match OkErr 啊。

有什么方法让我们偷偷懒吗?答案当然是——有啊!这就轮到 ? 问号操作符登场了:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
use std::fs::File;
use std::io;
use std::io::Read;
fn main() {
    let buf = read().unwrap();
    println!("cotent={}", buf);
}

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

    Ok(buf)
}

结论

问号操作符用于简化 Result 类型的判断。

参考资料