繁体   English   中英

Default::default() 如何在 rust 中工作?

[英]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 的出色答案, f32Default的实现如下所示:

impl Default for f32 {
    fn default() -> Self {  // Or f32 instead of Self, same thing.
        0.0f32
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM