我看到 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。
new()
与
default()
,而是 new()
与 Default
。并不是说Default
提供了方便的default()
,而是default()
是Default
的函数名称——编写一个fn default()
而不是Default
的实现是不惯用的。
如果你的类型有一个合理的方法来构造它,没有任何数据,其类型的“空”值,那么它应该:
实施
Default
Default
。
提供一个不带参数的new()
目前还没有一个更自然的带有参数的
new()
。
(例如,Box
Cell
,以及其他单个值的容器通常会有一个带有一个参数的new()
,但也可以通过调用内部类型的
Default
来实现Default::default()
。在这种情况下,new()
和 default()
不相同。) 如果可能,将
new()
const fn
。这允许调用者在编译时创建您类型的值,这对于初始化
static
变量和具有初始为空或始终为空值的 const
非常有用。(Trait 实现尚不能有 const fn
,因此即使您 also实现
Default
,这也是提供函数的好处。)