问题描述
我有一个结构Foo
,它由其他一些类型组成,并且在这些各种类型的容器上实现了特征(Rust playground):
struct MyType1 {}
struct MyType2 {}
struct Foo {
field1: MyType1,field2: MyType2,}
trait MyTrait {
/// Just a simple default implementation to keep things simple
fn do_something(&self) {
println!("Hello world");
}
}
struct MyContainer<T> {
val: T,}
// Use the default implementation for brevity.
impl MyTrait for MyContainer<Foo> {}
impl MyTrait for MyContainer<MyType1> {}
impl MyTrait for MyContainer<MyType2> {}
应该没事的。
注意到Foo
实际上是MyType1
和MyType2
的组合,我实际上想要做的是这样,这不起作用:
impl MyTrait for MyContainer<Foo> {
fn do_something(&self) {
// clearly this won't work as MyType1 and MyType2 are not `copy`,nor
// do I want to clone them.
MyContainer {
val: self.val.field1,}
.do_something();
MyContainer {
val: self.val.field2,}
.do_something();
}
}
我可以创建一个涵盖参考案例的全面实现:
impl<'a,T> MyTrait for MyContainer<&'a T>
where
MyContainer<T>: MyTrait,{
fn do_something(&self) {
println!("Inside ref trait")
}
}
这样我就可以在引用周围创建一个MyContainer
:
impl MyTrait for MyContainer<Foo> {
fn do_something(&self) {
MyContainer {
val: &self.val.field1,}
.do_something();
MyContainer {
val: &self.val.field2,}
.do_something();
}
}
这不能解决我的问题,因为我想在MyContainer<T>
而不是MyContainer<&T>
上运行实现。 MyContainer
是验证标记结构,它表示T
上验证方法的正确完成。也就是说,将T
放在MyContainer
中表示T
以某种方式被“验证”。组成结构实现必要的验证特性。它确实是API的一部分,在其中实现新的T
并不太繁琐,只需几个特性就足以使其正常工作。
由于MyContainer
是微不足道的,所以在我看来,应该有可能强制这样做,以创建MyContainer<T>
的瞬态表示,以完成正确的工作。
我宁愿使用安全的代码来执行此操作,但不安全的方法可能会解决。可以做我想做的吗?有没有更好的方法来处理包裹的构图结构?
这与我所看到的其他问题不同,在该问题中,特质是在T
上实现的,希望在&T
上实现特质而无需付出额外的努力。在这种情况下,我们已经在MyContainer<T>
上实现了它,而我希望它在MyContainer<&T>
上实现了就像它是MyContainer<T>
一样,无需付出任何额外的精力MyType1
和MyType2
以及以后的任何MyTypeN
的实现者的一部分。
根据我对注释的理解,我尝试了翻转逻辑,以便在包装的引用上实现实现,而对包装的值强加一揽子实现,但是我无法正确设置特质界限。 rust playground显示编译器在放弃之前无限递归。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)