【问题标题】:How to implement AsRef for a struct containing references如何为包含引用的结构实现 AsRef
【发布时间】:2020-03-24 06:43:36
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

  • 你想做什么?我不确定 AsRef 是否适合在您的情况下使用。你可能想要Borrow
  • 编译器错误很严重。您只需要为您的 Struct everywhere 显式指定生命周期参数。 fn as_ref(&self) -> &Struct&lt;'a&gt; { ... }.
  • @Sahsahae 这是一个答案,不是评论
  • 一两句话的答案是没有意义的,就像这条评论一样。我必须解释为什么它不能正常工作,而且我认为我做不到。

标签: struct rust lifetime


【解决方案1】:

对于fn as_ref(&amp;self) -&gt; &amp;Struct,编译器必须在返回类型中推断(隐式)泛型生命周期,但无法这样做。编译器期待Struct&lt;'a&gt;,但签名承诺提供免费参数。这就是你得到的原因

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

解决方法是修改签名返回Struct&lt;'a&gt;而不是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
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多