当前位置: 首页 > 知识库问答 >
问题:

为什么在下面的示例中显式声明生存期?[副本]

虞祯
2023-03-14

我正在研究一些锻炼的解决方案,但不明白为什么需要明确的终身声明?

#[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
    }
}

源练习练习

共有1个答案

皇甫宇定
2023-03-14

这是由于终生省略规则

考虑以下不起作用的新代码:

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 }
}

返回与返回您当前实现的类型(HighScores

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

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

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

或删除输出生存期:

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

 类似资料:
  • 根据我的理解,类被声明为final,以防止它被扩展/继承。因此,我认为在这方面可能会有安全性,也可能会有一些性能提升。 但这背后是否有一个非常具体的设计决策?比如说:实现某种设计模式?我确实在这里绕了一个类似的线!但答案并不是我想要的

  • Safari不接受我输入的时间格式,原因是什么? 我找到了解决办法;

  • 声明浮动时,我们可以通过两种方式将其接受为浮动: 在一种情况下,我可以将所有两种类型的值标记为数据类型,但在另一种情况下,我不能这样做,这是不符合逻辑的。 为什么?

  • 我使用ADAL库获取资源的访问令牌。有人知道过期时间是什么格式吗?更具体地说。 类只在解析后返回int32。所以,这不是一个好的指标。 尝试将其解析为和,但这些值相隔不到90分钟。几乎是一样的。 这是我从fiddler获得的和声明(用于https://jwt.io/解析令牌) :1475874457 :1475878357 价值观没有那么大的差异。

  • 那么在上述任何一个声明中, 为什么和不引用同一个对象?

  • 我在中使用带有4.1版本模拟器的android最新版本sdk。一切都很好。但是在我的中,对于任何应用程序的每次运行,我都会得到以下语句。 即使在Hello world应用程序中,我也得到相同的logcat输出。我没有在我的应用程序中使用多线程。有人能告诉我为什么在我的logcat中得到这些日志。 这是我的密码 在我的异步任务中,我从服务器获取JSONArray,解析它并列出。