在Rust中,结构体字面值中的".. "语法是什么?

25

来自std::default::Default文档:

#[derive(Default)]
struct SomeOptions {
    foo: i32,
    bar: f32,
}

fn main() {
    let options = SomeOptions { foo: 42, ..Default::default() };
}
.. 运算符被称为“结构体更新语法”,它可以用来将一个结构体的部分字段设置为默认值。在这种情况下,.. 的作用是将剩余的结构体参数填充为 SomeOptions 的默认值。使用.. 前缀是必要的,因为它指示编译器只更新传递给函数的参数中的结构体字段。返回的值仍然是整个结构体对象。

3
请参考Rust中&str下标中双点省略符运算符的含义是什么?,了解在 Rust 中 .. 的另一个用法。 - Shepmaster
1个回答

33

这是结构体更新语法。它仅是为了以简洁的方式将结构体的所有成员移动/复制到新结构体中,可能带有一些小修改。

“长”写法如下:

let a = SomeOptions::default();
let options = SomeOptions { foo: 42, bar: a.bar };

您可以将其类比于JavaScript中的"spread"运算符,但Rust的所有权和强类型的细微差别仍然发挥作用,因此它不是被广泛使用的。例如,您不能使用此语法在不同类型的值之间进行转换。


1
我也看到过这样的初始化方式 let SomeOptions { foo: 42 .. } = SomeOptions::default();,它看起来很相似。有人知道它是做什么用的吗? - Shabgard
3
@Shabgard,你在真正的Rust代码中没有看到这个,因为它是无效的Rust语法。如果你的意思是 let SomeOptions { foo, .. } =,那么可以参考忽略值的其余部分 - Shepmaster
谢谢。不,我不认为你提到的是这种情况,但对我来说也很有教育意义。这段代码正是我所考虑使用的确切实例。 - Shabgard
@Shabgard,这正是我在评论中使用的语法;你为什么认为它不同? - Shepmaster
哦,我有点困惑,因为你发送的链接指向了“使用..忽略值的其余部分”这个部分,它是在match块内使用的。但现在我研究了整个页面,似乎是Destructuring Structs的情况。现在我明白了。无论如何,这是非常有帮助的页面! - Shabgard

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接