Синтаксис ..expr
перемещает все отсутствующие элементы из expr
. Это движется . Это означает, что вы, как правило, не можете использовать его со ссылкой, поскольку вы не можете выйти из ссылки (хотя вы можете «переместить» Copy
типов из ссылки).
Чтобы решить вашу проблему, вам нужно клонировать, чтобы получить новый полный объект, с которого вы можете перейти:
fn foo(user: &User) -> User {
User {
active: false,
..user.clone()
}
}
( ссылка на игровую площадку )
Недостатком является то, что это также клонирует всех членов, которые вам не нужны, потому что вы уже указали их. В этом случае это нормально, так как клонирование active
является тривиальной операцией (поскольку это просто логическое значение), однако это сделает дополнительный бесполезный клон для username
:
fn foo(user: &User) -> User {
User {
username: "foo".into(),
..user.clone()
}
}