【问题标题】:What is the ".." syntax inside a struct literal in Rust?Rust 结构文字中的“..”语法是什么?
【发布时间】:2018-07-01 12:37:55
【问题描述】:

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

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

fn main() {
    let options = SomeOptions { foo: 42, ..Default::default() };
}

.. 前缀对Default::default() 的返回值有什么作用,为什么这里有必要?它几乎看起来像是在充当传播运算符,但我不确定。我了解..Default::default() 在做什么——用SomeOptions 的默认值填充剩余的结构参数,但不知道.. 的工作原理。这个运营商叫什么名字?

【问题讨论】:

标签: rust default operator-keyword


【解决方案1】:

这是struct update syntax。仅“需要”一种简洁的方式将结构的所有成员移动/复制到新结构中,可能需要进行一些小的修改。

“长”的写法是:

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

你确实可以把它想象成类似于 JavaScript 的“扩展”运算符,但是 Rust 的所有权和强类型的细微差别仍然起作用,所以它没有被广泛使用。例如,您不能使用此语法在不同类型的值之间切换。

【讨论】:

  • 我也见过像let SomeOptions { foo: 42 .. } = SomeOptions::default(); 这样的初始化,看起来很相似。有谁知道它的作用吗?
  • @Shabgard 你没有在真正的 Rust 代码中看到它,因为它是 invalid Rust syntax。如果你的意思是let SomeOptions { foo, .. } =,那么Ignoring Remaining Parts of a Value with ..
  • 谢谢。不,我不认为你提到的情况是这样,但它也对我有教育意义。 This piece of code 是我想到的用法的确切实例。
  • @Shabgard 这正是我在评论中使用的语法;为什么你认为它不一样?
  • 哦,我很困惑,因为您发送的链接指向“使用 .. 忽略值的剩余部分”这一部分,该部分在 match 块中使用。但是现在我研究了整个页面,这似乎是Destructuring Structs 的情况。现在我明白了。非常有帮助的页面!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-23
  • 2011-02-25
  • 2012-06-13
相关资源
最近更新 更多