为了澄清这一点,我并不是问如何使用默认的特性或如何实现它。我想知道的是一条线是如何
let a: f32 = Default::default();真的有用吗?Default::default()是什么实现?
我会想象像这样的事情
fn default<T: Default>() -> T {
T::default()
}我甚至不知道该搜索什么,因为这似乎是一个与特征相关的功能?这是件事吗?无论如何,我在std::default的文档里找不到它,所以我有点困惑。
发布于 2022-06-07 05:35:20
Default::default()只是<_ as Default>::default(),即“使用推断查找类型”。
发布于 2022-06-03 07:06:05
在这种情况下,所有这些行都是等效的。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的哪种类型的特征实现。最后,Default::default()可以是一个简单的替代方法,因为它允许编译器根据上下文推断类型,但通常不鼓励它,因为它可以减少代码的冗长性。
发布于 2022-06-03 07:14:26
为了添加到@Locke的出色答案,下面是Default用于f32的实现可能是什么样子:
impl Default for f32 {
fn default() -> Self { // Or f32 instead of Self, same thing.
0.0f32
}
}https://stackoverflow.com/questions/72485702
复制相似问题