为啥在以下示例中明确声明了生命周期? [复制]
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<u32>
一样)。
@Stargateur,确实如此,但我无法与这段代码的 sn-p 关联那么多。
询问学习语言过于广泛阅读doc.rust-lang.org/book/ch10-03-lifetime-syntax.html。或者问一个更重点的问题***.com/a/31625653/7076153回答你
@hellow,为了清楚一点,既然它是一个可能比结构寿命更长的引用,我们应该明确声明生命周期吗?
【参考方案1】:
这是由于lifetime elision rules
考虑不工作new
fn:
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<'a>
) 相同,现在您的输入 &[u32]
有一个省略的生命周期,它与返回类型中的显式生命周期不同,这是非法的对于您的示例结构。
还应注意,impl Header
中声明的生命周期不适用于函数输入的生命周期省略。
您可以通过设置输入的生命周期来解决此问题:
pub fn new(scores: &'a [u32]) -> Self
HighScores scores
或者省略输出生命周期:
pub fn new(scores: &[u32]) -> HighScores<'_>
HighScores scores
【讨论】:
感谢您的回答。最初,我没有在我的结构中明确声明引用的生命周期,但这样做很愚蠢,因为引用可能比结构长,反之亦然。如果我错了,请纠正我。以上是关于为啥在以下示例中明确声明了生命周期? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
与 Vec 相比,为啥 SmallVec 在存储具有生命周期的类型时会有不同的行为?