在 Rust 中使用新的与默认的结构构造

问题描述 投票:0回答:1

我看到 Rust 中的一些结构使用

default
进行构造,而我看到其他结构使用
new
1
new
default
的使用之间是否存在语义差异,或者一切都是惯例?如果是惯例,是否有关于该惯例/风格的官方标准?

我确实看到有一个

Default
特征,带有一个为简单结构创建默认
default
函数的宏,而我没有看到
new
类似的东西。这让我猜测
new
适用于实际的构造函数,而
default
主要仅适用于在其他数据结构中使用该结构时。但我找不到任何说明正确或不正确的内容。2

最后,构造函数是否具有用于构建结构的(可能是可选的)参数重要吗?看起来如果不带参数,

default
效果最好,但我对此没有信心。对于简单的构造函数,请说一个点类:

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

用户可以使用以下方式构建它:

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

但是,只有当用户可能更改的所有字段都是公开的时,这才有效。

总之,在 Rust 中构造结构时,什么时候使用

new
default
比较合适,无论是构造函数不带参数,还是可能带可选参数?

1 我还看到其他一些只是使用结构名称,但我认为这已被弃用?

2 它可能既不正确也不不正确,使其变得主观并且在堆栈溢出上并不真正合适。由于这种模糊性,我认为即使它是主观的,陈述其主观也是客观的,使其再次适合 SO。

rust struct constructor
1个回答
0
投票
new()

default()
,而是
new()
Default
。并不是说
Default
提供了方便的
default()
,而是
default()
Default
的函数名称——编写一个
fn default()
而不是
Default
的实现是不惯用的。 如果你的类型有一个合理的方法来构造它,没有任何数据,其类型的“空”值,那么它应该:

实施

Default
    。这样,包含您的其他类型也可以从中受益
  • Default

    
    
    提供一个不带参数的

    new()
  • if

    目前还没有一个更自然的带有参数的

    new()
    (例如,
    Box

    Cell
    ,以及其他单个值的容器通常会有一个带有一个参数的new()
    ,但也可以通过调用内部类型的
    Default
    来实现
    Default::default()
    。在这种情况下,
    new()
    default()
    相同。)
    
    如果可能,将

    new()
  • 函数(无论是否有参数)设置为
  • const fn

    。这允许调用者在编译时创建您类型的值,这对于初始化

    static
    变量和具有初始为空或始终为空值的
    const
    非常有用。
    (Trait 实现尚不能有 
    const fn
    ,因此即使您

    also

    实现

    Default
    ,这也是提供函数的好处。)
        

© www.soinside.com 2019 - 2024. All rights reserved.