web-dev-qa-db-ja.com

Rustの構造体リテラル内の「..」構文とは何ですか?

_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を入力しますが、_.._がどのように機能するかは理解していません。この演算子の名前は何ですか?

10
Evan Rose

これは 構造体更新構文 です。構造体のすべてのメンバーを新しいメンバーに移動/コピーする簡潔な方法が必要なだけで、場合によってはいくつかの小さな変更が必要です。

これを書く「長い」方法は次のようになります。

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

確かにJavaScriptの「spread」演算子に似ていると考えることができますが、Rustの所有権と強い型付けのニュアンスが依然として作用しているため、それほど広く使用されていません。たとえば、この構文を使用して、異なるタイプの値間を移動することはできません。

16
Shepmaster