为啥在以下示例中明确声明了生命周期? [复制]

Posted

技术标签:

【中文标题】为啥在以下示例中明确声明了生命周期? [复制]【英文标题】:Why lifetime was explicitly declared in the following example? [duplicate]为什么在以下示例中明确声明了生命周期? [复制] 【发布时间】:2020-05-09 15:57:37 【问题描述】:

我正在通过一些解决方案来进行练习,但无法弄清楚为什么需要明确的生命周期声明?

#[derive(Debug)]
pub struct HighScores<'a> 
    scores: &'a [u32],


impl<'a> HighScores<'a> 
    pub fn new(scores: &'a [u32]) -> Self 
        HighScores  scores 
    

    pub fn scores(&self) -> &[u32] 
        self.scores
    

    pub fn latest(&self) -> Option<u32> 
        self.scores.last().cloned()
    

    pub fn personal_best(&self) -> Option<u32> 
        self.scores.iter().max().cloned()
    

    pub fn personal_top_three(&self) -> Vec<u32> 
        let mut res_vec = self.scores.to_vec();

        res_vec.sort_unstable_by(|a, b| a.cmp(b).reverse());
        res_vec.truncate(3);

        res_vec
    

SourceExercism Exercise

【问题讨论】:

因为切片只是借用而不是拥有(就像 Vec&lt;u32&gt; 一样)。 @Stargateur,确实如此,但我无法与这段代码的 sn-p 关联那么多。 询问学习语言过于广泛阅读doc.rust-lang.org/book/ch10-03-lifetime-syntax.html。或者问一个更重点的问题***.com/a/31625653/7076153回答你 @hellow,为了清楚一点,既然它是一个可能比结构寿命更长的引用,我们应该明确声明生命周期吗? 【参考方案1】:

这是由于lifetime elision rules

考虑不工作newfn:

pub fn new(scores: &[u32]) -> Self 
    HighScores  scores 

error[E0621]: explicit lifetime required in the type of `scores`

同:

pub fn new(scores: &[u32]) -> HighScores<'a> 
    HighScores  scores 

返回 Self 与返回您当前正在实现的类型 (HighScores&lt;'a&gt;) 相同,现在您的输入 &amp;[u32] 有一个省略的生命周期,它与返回类型中的显式生命周期不同,这是非法的对于您的示例结构。

还应注意,impl Header 中声明的生命周期不适用于函数输入的生命周期省略。

您可以通过设置输入的生命周期来解决此问题:

pub fn new(scores: &'a [u32]) -> Self 
    HighScores  scores 

或者省略输出生命周期:

pub fn new(scores: &[u32]) -> HighScores<'_> 
    HighScores  scores 

【讨论】:

感谢您的回答。最初,我没有在我的结构中明确声明引用的生命周期,但这样做很愚蠢,因为引用可能比结构长,反之亦然。如果我错了,请纠正我。

以上是关于为啥在以下示例中明确声明了生命周期? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

与 Vec 相比,为啥 SmallVec 在存储具有生命周期的类型时会有不同的行为?

为啥 Blazor 生命周期方法会执行两次?

为啥 Rust 编译器要求我限制泛型类型参数的生命周期(错误 E0309)?

为啥链接生命周期仅与可变引用有关?

state&生命周期

为啥我们使用 - ngAfterContentInit 生命周期方法