在Rust中使用new vs default进行结构构造

pu82cl6c  于 2023-10-20  发布在  其他
关注(0)|答案(1)|浏览(160)

我看到Rust中的一些结构使用default来构造,而其他结构则使用new。1使用newdefault之间有语义上的区别吗?如果是惯例,有没有关于惯例/风格的官方标准?
我确实看到了一个Default trait,它有一个宏,为简单的结构体创建了一个默认的default函数,而我在new中没有看到类似的东西。这让我猜测new是指实际的构造函数,而default主要是指在其他数据结构中使用结构时。但我找不到任何正确或不正确的说法。
最后,如果构造函数有(可能是可选的)参数来构建结构,这有关系吗?看起来default在没有参数的情况下工作得最好,但我对此没有信心。对于简单的构造函数,比如说一个point类:

#[defive(Default)]
pub struct Point {
    pub x: u32, 
    pub y: u32,
    pub z: u32
}

用户可以通过使用以下命令来构建它:

Point {x: 42, ..Default::default()}

但只有当用户可能更改的所有字段都是公共字段时,这才有效。
总之,当在Rust中构造结构时,什么时候使用newdefault是合适的,无论是当构造函数没有参数,还是可能有可选参数时?
1我也看到其他一些人只是使用结构的名称,但我认为这是不可取的?
2可能它既不正确也不正确,这使得它主观,并不真正适合堆栈溢出。由于这种模糊性,我认为,即使它是主观的,它 * 是 * 客观的说,它的主观,使它再次适合SO。

g6ll5ycj

g6ll5ycj1#

不要把这个问题想成new()default(),而是new()Default。这并不是说Default提供了一个方便的default(),而是说default()Default的函数名--如果写一个fn default()而不是Default的实现,那将是不合逻辑的。
如果你的类型有一个合理的方法来构造它,而不需要任何数据,一个“空”的类型值,那么它应该:

  • 实现Default。这样,包含您的类型的其他类型可以在它们自己的Default中受益,并且通常您可以获得实现公共traits的所有好处。
  • 提供一个不带参数的new(),* 如果 * 还没有一个更自然的带参数的new()

(For例如,BoxCell和其他单个值的容器通常会有一个带一个参数的new(),但也会通过调用内部类型的Default::default()来实现Default。在这种情况下,new()default() * 不 * 相同。

  • 如果可能的话,将new()函数(无论它是否有参数)设置为const fn。这允许调用者在编译时创建你的类型的值,这对于像初始化static变量和const s初始化为空或始终为空的值这样的事情很有用。

(Trait实现还不能有const fn s,所以这是提供一个函数的好处,即使你也实现了Default

相关问题