[英]How does Default::default() work in rust?
只是为了澄清,我不是在问如何使用 Default 特征或如何实现它。 我想知道的是一条线如何
let a: f32 = Default::default();
真的有效吗? Default::default() 的实现是什么?
我会想象这样的事情
fn default<T: Default>() -> T {
T::default()
}
我什至不知道要搜索什么,因为这似乎是 Trait 的关联功能? 这是一回事吗? 无论如何,我在std::default
的文档中找不到它,所以我有点难过。
在这种情况下,所有这些行都是等效的。 Default
是由f32
实现的特征,其中包含函数fn default() -> Self
。 本质上,我们只是告诉编译器我们要调用该特征。 可能还有其他具有函数default
的特征,因此可以防止歧义。
// Explicitly invoke the f32 implementation of Default.
let a: f32 = Default::default();
let a = <f32 as Default>::default();
// Call the function default for f32 which is resolved to be the trait Default.
let a = f32::default();
话虽如此, f32::default()
几乎在所有情况下都是首选,因为它更好地表达了您想要做的事情。 f32
本身不提供default
功能,如果将竞争特征导入到模块中会很奇怪。 如果是这种情况, <f32 as Default>::default()
会更好,因为它明确说明了我们正在为哪个类型调用函数default
的 trait 实现。 最后, Default::default()
可以是一个简单的替代方案,因为它允许编译器根据上下文推断类型,但通常不鼓励使用,因为它可以使您的代码不那么冗长。
Default::default()
只是<_ as Default>::default()
,即“使用推理来查找类型”。
为了添加@Locke 的出色答案, f32
的Default
的实现如下所示:
impl Default for f32 {
fn default() -> Self { // Or f32 instead of Self, same thing.
0.0f32
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.