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

3
如果我有一个包含引用的结构体,例如:
struct Struct<'a> {
    reference: &'a str
}

我该如何为 Struct 实现 AsRef?我尝试了这个方法:
impl<'a> AsRef<Struct<'a>> for Struct<'a> {
    fn as_ref(&self) -> &Struct {
        self
    }
}

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

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


你想做什么?我不确定在你的情况下使用 AsRef 是正确的特质。你可能需要使用 Borrow - Boiethios
编译器错误很糟糕。您只需要在所有地方明确指定您的 Struct 的生命周期参数。[fn as_ref(&self) -> &Struct<'a> { ... }] (https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=8063f314cfdbb60e27e703f2a38e35be)。 - user11877195
@Sahsahae 这是一个答案,不是评论。 - Boiethios
提供一到两句话的回答毫无意义,就像这条评论一样。否则我必须解释为什么它不起作用,而我不认为我能做到。 - user11877195
1个回答

4

使用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
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接