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



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

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

如果你必须选择一个,实现Default特征是更好的选择,允许你的类型在更多的地方普遍使用,而new方法可能是尝试直接使用你的代码的人会寻找的。

但是,您的问题是错误的二分法:您可以同时做到这两点,我鼓励您这样做!当然,重复自己是愚蠢的,所以我会从另一个中调用一个(哪种方式并不重要):

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

Clippy 甚至对这种确切的情况有一个棉绒!

我在具有成员数据结构的结构中使用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();
}

最新更新