是否有一种优雅的方法来重写使用`match`语句获取或创建Option的方法? [重复]

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

我将代码简化为以下几行:

#[derive(Debug)]
struct Config {
    values: Vec<String>,
    compiled: Option<Vec<String>>,
}

impl Config {
    fn comp_values(&mut self) -> &Vec<String> {
        if self.compiled.is_none() {
            self.compiled = Some(self.values.clone());
        }
        self.compiled.as_ref().unwrap()
    }

    fn comp_values_match(&mut self) -> &Vec<String> {
        match self.compiled {
            Some(_) => self.compiled.as_ref().unwrap(),
            None => {
                self.compiled = Some(self.values.clone());
                self.compiled.as_ref().unwrap()
            }
        }
    }
}

fn main() {
    let mut c = Config {
        values: vec![String::from("a"), String::from("b")],
        compiled: None,
    };
    println!("config before: {:?}", c);
    println!("compiled: {:?}", c.comp_values());
    println!("config after: {:?}", c);
}

我想拥有的东西是:

match self.compiled {
    Some(v) => v,
    None => {
        // assemble v and assign it to self.compiled
        v
    },
}

就像书中的closure chapter一样。由于u32实现了Copy特性,因此在书中是否可能仅起作用?如果将match行更改为match self.compiled.as_ref(),则Some(v) => v,有效。然后,在None分支中,我将无法像self.compiled = ...那样进行分配,因为我在该块中具有变量'open'(或用self.compiled.as_ref()引用)。

我的假设正确吗?在这种情况下,comp_values()方法是否是最优雅的解决方案?

rust pattern-matching optional
1个回答
0
投票
© www.soinside.com 2019 - 2024. All rights reserved.