【问题标题】: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。或者问一个更重点的问题stackoverflow.com/a/31625653/7076153回答你
  • @hellow,为了清楚一点,既然它是一个可能比结构寿命更长的引用,我们应该明确声明生命周期吗?

标签: rust lifetime


【解决方案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 }
}

【讨论】:

  • 感谢您的回答。最初,我没有在我的结构中明确声明引用的生命周期,但这样做很愚蠢,因为引用可能比结构长,反之亦然。如果我错了,请纠正我。
猜你喜欢
  • 1970-01-01
  • 2011-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-02
  • 2019-08-23
  • 2014-10-10
相关资源
最近更新 更多