Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Syntax 是否有在类似结构之间移动字段的语法?_Syntax_Rust - Fatal编程技术网

Syntax 是否有在类似结构之间移动字段的语法?

Syntax 是否有在类似结构之间移动字段的语法?,syntax,rust,Syntax,Rust,我有一个大结构Foo,我想将它映射到Foo中,其中大多数字段都不需要更新。我希望使用。操作符来实现这一点,但这是一个类型错误,因为它们在技术上是不同的类型 也就是说,考虑到: struct Foo<T> { a: usize, b: usize, t: T, } let q: Foo<Q>; structfoo{ a:使用, b:使用, t:t, } 让我们问:福; 我想写: let r = Foo::<R> { t: f

我有一个大结构
Foo
,我想
将它映射到
Foo
中,其中大多数字段都不需要更新。我希望使用
操作符来实现这一点,但这是一个类型错误,因为它们在技术上是不同的类型

也就是说,考虑到:

struct Foo<T> {
    a: usize,
    b: usize,
    t: T,
}

let q: Foo<Q>;
structfoo{
a:使用,
b:使用,
t:t,
}
让我们问:福;
我想写:

let r = Foo::<R> {
    t: fixup(q.t),
    ..q
};
让r=Foo::{
t:修正(q.t),
Q
};
但是,这给了我一个类型错误:

错误[E0308]:类型不匹配
|
3 |…q
|^应为结构'R',找到结构'Q`
|
=注意:应为'Foo'类型`
找到类型'Foo`
类型错误是合理的,因为在这种情况下可以将类型视为模板

我唯一的解决办法是完整地写出转换,它很快就会变得难看:

let r = Foo::<R> {
    a: q.a,
    b: q.b,
    t: fixup(q.t),
};
让r=Foo::{
答:答:,
b:q.b,
t:修正(q.t),
};
下面是一个示例,包括编译错误和长表单


是否有更好的语法,或者有更好的方法来实现这些非平凡结构的
map
-like方法

是否有在类似结构之间移动字段的语法

不,没有这样的语法。“struct update”(以前称为“functional record update”)语法的当前实现只允许完全相同的类型

是否有更好的语法,或者有更好的方法来实现这些非平凡结构的类映射方法

不,我唯一的建议是先分解原始结构,然后重新创建。您也不需要推断出的

设Foo{a,b,c,d,e,t}=q;
设r=Foo{
A.
B
C
D
E
t:fixup(t),
};
另见:

  • 类似问题:

我很高兴这只是其他Rust论坛的复制品,而不是StackOverflow。谢谢你的链接和解构建议。@FauxFaux:我对匹配语句有过类似的杀伤力,比如
match Option{Some(t)=>Some(makeItU(t)),other=>other}
,它抱怨
other
不是
Option
类型,尽管在这两种情况下“None”是同一个原子;或者类似地,不同的生命周期。。。当其余的变量都是静态的时
。希望这种剪纸能及时变得更好:)@MatthieuM。这看起来不可能被任何现有的RFC覆盖,如果你想修复它,可能值得在更高的层次上提升?对于
选项
的情况,我怀疑人们会告诉你使用
映射
,或者显式地使用
None=>None
,这两种方法都有效。@FauxFaux:我不确定是否有任何“解决”问题的愿望。它基本上需要依赖路径的类型,这是对任何语言的一个非常重要的补充。至于选项,我只是用它来演示,因为它是熟悉的;在自定义枚举上没有
映射