【问题标题】:Lifetime for ref to generic in trait引用到通用特征的生命周期
【发布时间】:2021-11-16 18:55:15
【问题描述】:

我试图要求一个泛型类型可以通过 const ref 索引到另一个泛型:

struct A<T, I> where T: Index<&I> {
    t: T,
    some_more_uses_of_I...
}

它不编译要求我为 &I 提供生命周期。当我将其更改为 &amp;'_ I 时,编译器会抱怨“'_ 不能在此处使用”和“'_ 是保留的生命周期名称”。我怎样才能让它工作?据我了解,生命周期并没有真正的需要,引用必须仅在执行 [] 期间才有效,我相信我不应该将其绑定到任何其他对象。

【问题讨论】:

  • 很难说没有更完整的示例,但是如果将 where 子句移至 impl 块,您可能会得到您想要的。这样:impl&lt;'a, T, I&gt; A&lt;T, I&gt; where T: Index&lt;&amp;'a I&gt; 的生命周期不链接到结构 A 本身。

标签: generics rust reference lifetime


【解决方案1】:

如果不确切知道你是如何使用这个结构的,很难说。但听起来您可以使用 higher-ranked trait bound 以使约束在整个生命周期内都是通用的:

struct A<T, I> 
where 
    T: for<'a> Index<&'a I>
{
    t: T,
    some_more_uses_of_I...
}

【讨论】:

  • @Dekakaruk 如果您没有收到此代码的错误消息,这可能意味着您实际上并没有在结构中使用Index&lt;&amp;I&gt;,因此这里不应该有限制(因为我在我对另一个答案的评论中也提到了)。如果边界实际上是必要的——也就是说,如果你在结构定义中使用Index&lt;&amp;'x I&gt;——那么'x必须是(1)与其他答案一样的结构参数,(2)'static,或(3) 结构定义中另一个 HRTB 的一部分。如果这些都不是,我建议删除绑定。
【解决方案2】:

这应该是编译

struct A<'a, T, I>
    where T: Index<&'a I> {
        t: T
    }

您可以在https://doc.rust-lang.org/book/ch10-03-lifetime-syntax.html#lifetime-annotations-in-struct-definitions查看更多信息

【讨论】:

  • "参数类型I 可能寿命不够长", "帮助:考虑添加一个明确的生命周期限制...:I: 'a"。我不太了解生命周期说明符,但据我所知,这需要他引用比 A 更长的寿命,这不是有意的
  • 这篇文章或许对你有更好的帮助,stackoverflow.com/questions/27589054/…
  • 抱歉,我看不到相关性。我的问题是如何表明生命与任何事情无关,或者至少要理解为什么需要它
  • 也很抱歉,我不太明白。您也可以声明“struct A {t: &'static str}”,“为什么”称为“终身省略”,是编译器要求(blog.rust-lang.org/2018/12/06/…
  • 如果不了解更多关于@Dekakaruk 的用例,很难确定,但这可能是一个不适当参数的示例,因为在结构上放错了泛型而不是impl。我在stackoverflow.com/a/66369912/3650362 写过这个。即使有必要限制,因为&lt;T as Index&lt;&amp;'a I&gt;&gt;::Output 相对不太可能使用'a,所以在这里使用 HRTB 可能更有意义。但我重申,在大多数情况下,完全没有界限可能是语义上更正确的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-04-22
  • 2018-03-19
  • 1970-01-01
  • 2019-12-18
  • 1970-01-01
  • 2017-11-08
  • 1970-01-01
相关资源
最近更新 更多