我看到Rust中的一些结构使用default
来构造,而其他结构则使用new
。1使用new
和default
之间有语义上的区别吗?如果是惯例,有没有关于惯例/风格的官方标准?
我确实看到了一个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中构造结构时,什么时候使用new
和default
是合适的,无论是当构造函数没有参数,还是可能有可选参数时?
1我也看到其他一些人只是使用结构的名称,但我认为这是不可取的?
2可能它既不正确也不正确,这使得它主观,并不真正适合堆栈溢出。由于这种模糊性,我认为,即使它是主观的,它 * 是 * 客观的说,它的主观,使它再次适合SO。
1条答案
按热度按时间g6ll5ycj1#
不要把这个问题想成
new()
与default()
,而是new()
与Default
。这并不是说Default
提供了一个方便的default()
,而是说default()
是Default
的函数名--如果写一个fn default()
而不是Default
的实现,那将是不合逻辑的。如果你的类型有一个合理的方法来构造它,而不需要任何数据,一个“空”的类型值,那么它应该:
Default
。这样,包含您的类型的其他类型可以在它们自己的Default
中受益,并且通常您可以获得实现公共traits的所有好处。new()
,* 如果 * 还没有一个更自然的带参数的new()
。(For例如,
Box
、Cell
和其他单个值的容器通常会有一个带一个参数的new()
,但也会通过调用内部类型的Default::default()
来实现Default
。在这种情况下,new()
和default()
* 不 * 相同。new()
函数(无论它是否有参数)设置为const fn
。这允许调用者在编译时创建你的类型的值,这对于像初始化static
变量和const
s初始化为空或始终为空的值这样的事情很有用。(Trait实现还不能有
const fn
s,所以这是提供一个函数的好处,即使你也实现了Default
。