Что такое синтаксис .. внутри структурного литерала в 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, но не понимаю, как работает ... Как называется этот оператор?


person Evan Rose    schedule 22.01.2018    source источник
comment
См. также Что означает оператор двойного многоточия в контексте индекса &str? для получения информации о другом использовании .. в Ржавчина.   -  person Shepmaster    schedule 22.01.2018


Ответы (1)


Это синтаксис обновления структуры. «Необходимо» только иметь краткий способ перемещения/копирования всех членов структуры в новую, возможно, с некоторыми небольшими изменениями.

«Длинный» способ написать это будет так:

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

Вы действительно можете думать об этом как об операторе «расширения» в JavaScript, но нюансы владения Rust и строгая типизация все еще играют роль, поэтому он не так широко используется. Например, вы не можете использовать этот синтаксис для перехода между значениями разных типов.

person Shepmaster    schedule 22.01.2018
comment
Я также видел инициализацию, подобную этой let SomeOptions { foo: 42 .. } = SomeOptions::default();, которая кажется похожей. Кто-нибудь знает, что он делает? - person Shabgard; 23.11.2020
comment
@Shabgard, вы не видели этого в реальном коде Rust, потому что это недействительный Rust синтаксис. Если вы имели в виду let SomeOptions { foo, .. } =, то Игнорирование оставшихся частей значения с помощью .. - person Shepmaster; 23.11.2020
comment
Спасибо. Нет, я не думаю, что это тот случай, о котором вы упомянули, но это также поучительно для меня. Этот фрагмент кода точный пример использования, который я имел в виду. - person Shabgard; 23.11.2020
comment
@Shabgard это именно тот синтаксис, который я использовал в своем комментарии; почему вы думаете, что это по-другому? - person Shepmaster; 23.11.2020
comment
О, я запутался, потому что отправленная вами ссылка указывала на этот раздел «Игнорирование оставшихся частей значения с помощью ..», который использовался внутри блока match. Но теперь, когда я изучил всю страницу, похоже, дело в Разрушение структур. Теперь я это понимаю. В любом случае очень полезная страница! - person Shabgard; 23.11.2020