gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 07:46:13 27 4
gpt4 key购买 nike

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

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

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com