< 返回版块

ilp64 发表于 2020-12-16 14:50

Tags:Option

比如下面代码中,tags设置默认值的操作有没有简单的方法?

现在这样如果struct嵌套层级多一些,那代码肯定写的很繁琐,看起来不够直观。

请大佬们指点一下🙏

struct Data {
    tags: Option<Vec<i32>>,
    ...
}

fn handle_data(data: Option<Data>) {
    // 这里我想给tags设置个空的Vec作为默认值
    let tags = data
        .map_or(vec![], |d| d.tags.unwrap_or_else(vec![]));
}

评论区

写评论
Neutron3529 2020-12-16 17:29

总觉得两层Option有点过于多余了

难道对tag来说,vec![]跟None的含义不同吗?

如果没有不同的话,直接把tag写成Vec就好,没必要再套一层Option的

作者 ilp64 2020-12-16 15:17

大佬,帮我看dataNone时,我的理解对不对。

如果data参数是None,那其实就相当于是let tags = None.unwrap_or_default();了吧。这个时候能生成正确的空Vec是因为编译器根据代码中|d| d.tags的返回值类型推导出要应用的默认值类型是Vec<i32>

--
👇
songzhi: ```rust fn handle_data(data: Option) { // 这里我想给tags设置个空的Vec作为默认值 let tags = data.and_then(|d| d.tags).unwrap_or_default(); }

songzhi 2020-12-16 15:00
fn handle_data(data: Option<Data>) {
    // 这里我想给tags设置个空的Vec作为默认值
    let tags = data.and_then(|d| d.tags).unwrap_or_default();
}
1 共 3 条评论, 1 页