如何使用 Rust 中返回值的多行匹配子句?

mwl*_*lon 2 rust

对于一个玩具示例,假设我想为磁盘上的文件创建缓存并记录其输出。这是我希望能发挥作用的:

struct Cache {
    data: HashMap<String, String>
}

impl Cache {
    fn load(&mut self, filename: &str) -> String {
        let result = match self.data.get(filename) {
            Some(s) => s.clone(),
            None => {
                let s = fs::read_to_string(filename).expect("couldn't read");
                self.data.insert(String::from(filename), s.clone());
                return s;
            }
        };
        println!("my result: {}", result);
        return result;
    }
}
Run Code Online (Sandbox Code Playgroud)

但该None => {...}子句不像它自己的函数那样执行,因此它return退出整个load函数。我尝试了几种不同的方法,但无法让多行匹配子句返回值。有什么方法可以让这种类型的matchRust 工作吗?

Rust 版本:1.50.0 语言版本:2018

seb*_*etz 6

返回块中的最后一条语句,该语句适用于任何块,即,如果您将其s作为匹配臂中的最后一行None,则将从该块返回该语句。

所以你应该把那只手臂改为

            None => {
                let s = fs::read_to_string(filename).expect("couldn't read");
                self.data.insert(String::from(filename), s.clone());
                s
            }
Run Code Online (Sandbox Code Playgroud)

注:没有也return没有;

return仅当从函数或闭包返回时才需要使用。