【问题标题】:Most idiomatic way to create a default struct创建默认结构的最惯用方式
【发布时间】:2017-01-06 16:54:04
【问题描述】:

为了创建一个默认结构,我以前在 Rust 中看到 fn new() -> Self,但今天,我发现了 Default。所以有两种方法可以创建默认结构:

struct Point {
    x: i32,
    y: i32,
}

impl Point {
    fn new() -> Self {
        Point {
            x: 0,
            y: 0,
        }
    }
}

impl Default for Point {
    fn default() -> Self {
        Point {
            x: 0,
            y: 0,
        }
    }
}

fn main() {
    let _p1 = Point::new();
    let _p2: Point = Default::default();
}

什么是更好/最惯用的方法?

【问题讨论】:

    标签: rust


    【解决方案1】:

    如果你不得不选择一个,实现Default trait 是更好的选择,可以让你的类型在更多地方通用,而new 方法可能是人类正在尝试的直接使用你的代码会寻找。

    但是,您的问题是错误的二分法:您可以两者都做,我鼓励您这样做!当然,重复自己是愚蠢的,所以我会打电话给另一个(无论哪种方式并不重要):

    impl Point {
        fn new() -> Self {
            Default::default()
        }
    }
    

    Clippy even has a lint for this exact case!

    我在具有成员数据结构的结构中使用Default::default(),我可能会在其中更改实现。例如,我当前可能正在使用HashMap,但想切换到BTreeMap。使用Default::default 让我少了一个地方可以改变。


    在这种特殊情况下,您甚至可以导出Default,使其非常简洁:

    #[derive(Default)]
    struct Point {
        x: i32,
        y: i32,
    }
    
    impl Point {
        fn new() -> Self {
            Default::default()
        }
    }
    
    fn main() {
        let _p1 = Point::new();
        let _p2: Point = Default::default();
    }
    

    【讨论】:

    • 我只想指出,“配置”结构有一个非常常见的模式,看起来像 let config = MyConfig { option1: 2, option2: None, .. Default::default() }
    • @WesleyWiser 是的!尽管您不限于Default::default();它可以是 MyStruct::new() 甚至是现有变量。
    猜你喜欢
    • 2015-05-22
    • 1970-01-01
    • 1970-01-01
    • 2017-11-30
    • 2015-12-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-06
    • 1970-01-01
    相关资源
    最近更新 更多