如何为包含引用的结构实现AsRef

时间:2019-11-28 15:08:09

标签: struct rust lifetime

如果我有一个包含引用的结构,如下所示:

struct Struct<'a> {
    reference: &'a str
}

如何为Struct实现AsRef?我尝试过:

impl<'a> AsRef<Struct<'a>> for Struct<'a> {
    fn as_ref(&self) -> &Struct {
        self
    }
}

但它不能满足编译器要求:

  

由于需求冲突,无法为通用类型的生命周期参数推断适当的生命周期

1 个答案:

答案 0 :(得分:3)

使用fn as_ref(&self) -> &Struct时,编译器必须推断返回类型的(隐式)泛型生存期,但不能这样做。编译器期望使用Struct<'a>,但是签名会提供一个自由参数。那就是为什么你得到

      expected fn(&Struct<'a>) -> &Struct<'a>
         found fn(&Struct<'a>) -> &Struct<'_>  // '_ is some anonymous lifetime,
                                               // which needs to come from somewhere

解决方案是修改签名以返回Struct<'a>而不是Struct。更短更清晰:

impl<'a> AsRef<Struct<'a>> for Struct<'a> {
    fn as_ref(&self) -> &Self {  // Self is Struct<'a>, the type for which we impl AsRef
        self
    }
}