我可以将传播/结构更新语法与 to_owned() 结合使用吗?

Can I combine the spread / struct update syntax with to_owned()?

我喜欢你可以替换像

这样的东西
Doc {
  id: 1,
  a: new_doc.a,
  b: new_doc.b,
  c: new_doc.c,
  d: new_doc.d,
  e: new_doc.e,
};

Doc {
  id: 1,
  ..new_doc
};

但是你能用这个做同样的事情吗:

Doc {
  id: 1,
  a: new_doc.a.to_owned(),
  b: new_doc.b.to_owned(),
  c: new_doc.c.to_owned(),
  d: new_doc.d.to_owned(),
  e: new_doc.e.to_owned(),
};

如果不是,最短的写法是什么?

在这种情况下,如果您不想失去原始结构的所有权,解决方案是克隆它(或者如果您愿意,可以实施 ToOwned,尽管 clone 更正确海事组织):

#[derive(Clone, Debug)]
struct Doc {
    id: usize, 
    a: String,
}

fn main() {
    let d = Doc {id: 1, a: "foo".to_string()};
    let d2 = Doc {
        id: 2,
        ..d.clone()
    };
    
    println!("{d:?} {d2:?}");
}

Playground