【发布时间】:2019-05-16 19:35:50
【问题描述】:
我有一个很大的结构Foo<Q>,并且想将map 转换成一个Foo<R>,其中大部分字段都不需要更新。我希望为此使用 .. 运算符,但这是一个类型错误,因为它们在技术上是不同的类型。
也就是说,给定:
struct Foo<T> {
a: usize,
b: usize,
t: T,
}
let q: Foo<Q>;
我想写:
let r = Foo::<R> {
t: fixup(q.t),
..q
};
但是,这给了我一个类型错误:
error[E0308]: mismatched types
|
3 | ..q
| ^ expected struct `R`, found struct `Q`
|
= note: expected type `Foo<R>`
found type `Foo<Q>`
类型错误是合理的,因为在这种情况下可以将类型视为模板。
我唯一的解决方法是完整地写出转换,这很快就会变得丑陋:
let r = Foo::<R> {
a: q.a,
b: q.b,
t: fixup(q.t),
};
这里是a playground with a full test-case,包括编译错误和长格式。
在某处是否有更好的语法,或者有更好的方法来为非平凡的结构实现这些map-like 方法?
【问题讨论】: