我正试图用一句俏皮话,或者一种不那么难看、不那么重复的方式来做到这一点:

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"),
        }
    );
}

推荐答案

您可以使用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")),
    )
}

Playground

您可以通过调用as_deref来避免堆分配String,这会将Option<String>转换为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"),
    )
}

Playground

(go 掉explicit return也是很好的风格,我在上面已经做过了.)

Rust相关问答推荐

抽象RUST中的可变/不可变引用

如何在Rust中表示仅具有特定大小的数组

Rust函数的返回值不能引用局部变量或临时变量

你能在Rust中弃用一个属性吗?

如何将生存期参数添加到框<>;具有dyn类型别名

Rust wasm 中的 Closure::new 和 Closure::wrap 有什么区别

可以在旋转循环中调用try_recv()吗?

在没有任何同步的情况下以非原子方式更新由宽松原子操作 Select 的值是否安全?

Rust中的一生语法有什么作用?

在多核嵌入式 Rust 中,我可以使用静态 mut 进行单向数据共享吗?

如何限制通用 const 参数中允许的值?

返回迭代器的特征

特征中定义的类型与一般定义的类型之间的区别

如何在 Rust 中编写涉及异步的重试函数

如何存储返回 Future 的闭包列表并在 Rust 中的线程之间共享它?

通用函数中的生命周期扣除和borrow (通用测试需要)

类型组的通用枚举

使用 rust-sqlx/tokio 时如何取消长时间运行的查询

在传输不可复制的值时实现就地枚举修改

基于名称是否存在的条件编译