代码之家  ›  专栏  ›  技术社区  ›  hellow Adolfo Casari

基于类型参数的错误特征选择

  •  3
  • hellow Adolfo Casari  · 技术社区  · 7 年前

    我有双重性格 Resolve

    pub trait Resolve<RHS = Self> {
        type Output;
        fn resolve(self, rhs: RHS) -> Self::Output;
    }
    

    我实现了一些琐碎的特性,其中两个参数都是引用的( self 是 &'a Foo rhs 是 &'b Foo ):

    struct Foo;
    
    impl <'a, 'b> Resolve<&'b Foo> for &'a Foo {
        type Output = Foo;
        fn resolve(self, rhs: &'b Foo) -> Self::Output {
            unimplemented!()
        }
    }
    

    如果我现在写信

    fn main() {
        let a: &Foo = &Foo;
        let b = Foo;
        a.resolve(&b);
    }
    

    它可以很好地编译,但是如果我尝试在我的结构上实现它 Signal ,它将不起作用。

    pub struct Signal<'a, T> {
        ps: Vec<&'a T>,
    }
    
    impl<'a, T: Resolve<&'a T, Output = T> + 'a> Signal<'a, T> {
        pub fn foo(&mut self) {
            let a: &T = &self.ps[0];
            let b = &self.ps[1];
            a.resolve(b);
        }
    }
    
    error[E0507]: cannot move out of borrowed content
      --> src/main.rs:25:9
       |
    25 |         a.resolve(b);
       |         ^ cannot move out of borrowed content
    

    playground

    2 回复  |  直到 7 年前
        1
  •  6
  •   trent oli_obk    7 年前

    这一特点是必然的 foo T 工具 Resolve ,但你试着打电话 .resolve() 关于类型的值 &T

    换言之 参考文献 到 T 必须实施 决心 higher-ranked trait bound :

    impl<'a, T> Signal<'a, T>
    where
        for<'b> &'b T: Resolve<&'a T, Output = T>,
    {
        pub fn foo(&mut self) { ... }
    }
    
        2
  •  1
  •   hellow Adolfo Casari    7 年前

    经过思考,我想出了一个更简单的解决方案,不依赖于HRTB。

    impl<'a, T> Signal<'a, T>
    where
        &'a T: Resolve<&'a T, Output = T> + 'a,
    {
        pub fn foo(&mut self) {
            let a: &T = &self.ps[0];
            let b = &self.ps[1];
            a.resolve(b);
        }
    }
    

    &T 工具 Resolve
    你必须使用 where clause

    推荐文章