首页 > 解决方案 > 如何为包含引用的结构实现 AsRef

问题描述

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

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

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

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

但它无法满足编译器要求:

由于要求冲突,无法为泛型类型中的生命周期参数推断适当的生命周期

标签: structrustlifetime

解决方案


编译器必须在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
    }
}

推荐阅读