代码之家  ›  专栏  ›  技术社区  ›  RedCrafter LP

用隐式生命周期方法实现外来特质

  •  0
  • RedCrafter LP  · 技术社区  · 4 月前

    我有以下我无法控制的外国特质:

        pub trait Foo<T> {
            fn foo(input: &T) -> Self;
    }
    

    我想实现这个特征,作为生活在T内部的无尺寸类型的参考

        impl Foo<Bar> for &[String] {
            fn from_ref(input: &Bar) -> Self {
                &input.bar
            }
        }
    

    问题是它不能编译。它需要输入才能超过返回值。之所以如此,是因为它存储了它。

    我尝试添加显式的生命周期,但显然我无法为输入和输出添加生命周期;由于函数签名,条形图。我也不能限制where子句中的隐式生存期。

    1 回复  |  直到 4 月前
        1
  •  0
  •   kmdreko    4 月前

    你无法实现你想要的东西。trait接口没有定义以下对象之间的生命周期关系 input Self 因此,实施不能建立一个。

    为了做到这一点,该特征需要:

    • 在其上定义并与参考链接的寿命:

      pub trait Foo<'a, T> {
          fn foo(input: &'a T) -> Self;
      }
      
    • 要使用泛型关联类型:

      pub trait Foo<T> {
          type Ref<'a> where T: 'a;
          fn foo<'a>(input: &'a T) -> Self::Ref<'a>;
      }