是否有可能代表对该类型的一些琐碎包装的引用,就像该类型被包装为该类型的拥有价值一样?

问题描述

我有一个结构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实际上是MyType1MyType2的组合,我实际上想要做的是这样,这不起作用:

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> 一样,无需付出任何额外的精力MyType1MyType2以及以后的任何MyTypeN的实现者的一部分。

根据我对注释的理解,我尝试了翻转逻辑,以便在包装的引用上实现实现,而对包装的值强加一揽子实现,但是我无法正确设置特质界限。 rust playground显示编译器在放弃之前无限递归。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...