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

关于rust - 创建默认结构的最惯用方式,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41510424/

10-10 18:33
查看更多