如果变量不是None,如何返回变量本身,如果None,则返回“None”?

Can*_*ner 3 rust

我正在尝试用一种简单的方式来做到这一点,或者一种不那么丑陋和不那么重复的方式:

fn class_requirements(current_class: Model) -> String {
    return format!(
        "
        Required Race: {}
        Required Weapon Proficiency: {}
        ",
        match current_class.req_race {
            Some(race) => race,
            None => String::from("None"),
        },
        match current_class.req_weapon_proficiency {
            Some(prof) => prof,
            None => String::from("None"),
        }
    );
}
Run Code Online (Sandbox Code Playgroud)

Joh*_*ica 8

您可以使用unwrap_orunwrap_or_else来解包Option并替换该情况的替代值None

fn class_requirements(current_class: Model) -> String {
    format!(
        "
        Required Race: {}
        Required Weapon Proficiency: {}
        ",
        current_class.req_race.unwrap_or_else(|| String::from("None")),
        current_class.req_weapon_proficiency.unwrap_or_else(|| String::from("None")),
    )
}
Run Code Online (Sandbox Code Playgroud)

操场

String您可以通过调用as_deref将 an 转换Option<String>为 an 来避免堆分配s Option<&str>。然后"None"可以是静态字符串:

fn class_requirements(current_class: Model) -> String {
    format!(
        "
        Required Race: {}
        Required Weapon Proficiency: {}
        ",
        current_class.req_race.as_deref().unwrap_or("None"),
        current_class.req_weapon_proficiency.as_deref().unwrap_or("None"),
    )
}
Run Code Online (Sandbox Code Playgroud)

操场

(删除显式的return也是一种很好的风格,我已经在上面完成了。)