最常用的创建默认结构的方法

时间:2017-01-06 16:54:05

标签: rust

要创建默认结构,我曾经在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();
}

这样做的最好/最惯用的方法是什么?

1 个答案:

答案 0 :(得分:10)

如果 选择,那么实现Default特征是更好的选择,允许在更多地方使用您的类型,而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();
}