代码之家  ›  专栏  ›  技术社区  ›  apt1002

为什么Deref式的特质不构成?

  •  1
  • apt1002  · 技术社区  · 2 年前

    在该代码中, MyDeref 符合的定义 Deref 来自标准库,以及 MemoryView (从一个更复杂的例子简化而来)几乎也是如此。

    pub trait MyDeref {
        type Target: ?Sized;
        fn deref<'a>(&'a self) -> &'a Self::Target;
    }
    
    pub trait MemoryView {
        type T;
        fn at_ref<'a>(&'a self) -> &'a Self::T;
    }
    

    我希望这些特性能够组成,这样我就可以写一个 MemoryView 覆盖任何取消引用到 MemoryView :

    impl<V: MemoryView, T: MyDeref<Target=V>> MemoryView for T {
        type T = V::T;
        fn at_ref<'a>(&'a self) -> &'a Self::T {
            self.deref().at_ref()
        }
    }
    

    但是,我得到了一个编译器错误:

    error[E0309]: the parameter type `V` may not live long enough
      --> src/lib.rs:14:9
       |
    14 |         self.deref().at_ref()
       |         ^^^^^^^^^^^^ ...so that the type `V` will meet its required lifetime bounds
    

    似乎是在说方法签名意味着 Self Self::T 寿命超过 'a ,但不是这样 Self::Target 寿命超过 a

    我很难想象 自身::目标 寿命可能比 自己 .这是不可能的 Deref 类型,例如 &'a Target Box<Target>

    我也在努力写一些有特质的东西 自身::目标 寿命超过 自己

    这种一揽子实施感觉应该是可能的。帮助

    1 回复  |  直到 2 年前
        1
  •  2
  •   cdhowie    2 年前

    这是一种情况,你做错了什么,以至于编译器非常困惑,建议你做一些对解决根本问题没有帮助的事情。

    您可以通过(否则不必要的终身GAT)消除此错误,这样编译器就可以揭示真正的问题: V 在中不受约束 MemoryView for T 实施因为 五、 不受约束,编译器无法真正看到它与其他生存期之间的关系,从而推断出合适的生存期 五、 …即使你能解决这个问题,你也不能有一个不受约束的泛型类型参数 无论如何 所以这是一个没有意义的问题。

    解决方案是删除 五、 参数。你在这里使用它的唯一原因是你可以要求 T::Target 机具 MemoryView --所以只需添加该绑定,然后进行调整 type T 在相应的实施中:

    impl<T> MemoryView for T
    where
        T: MyDeref,
        <T as MyDeref>::Target: MemoryView,
    {
        type T = <<T as MyDeref>::Target as MemoryView>::T;
    
        fn at_ref<'a>(&'a self) -> &'a Self::T {
            self.deref().at_ref()
        }
    }
    

    ( Playground )

    推荐文章