我想我了解生命周期如何与函数参数/输出和结构一起工作,因为这些情况在书中(以及在nomicon 中进一步解释),但我不明白生命周期如何用于类型边界。例如:
trait Min<Elmt> {
fn get_min(&self) -> Elmt;
}
impl<T, Elmt> Min<Elmt> for T
where
&T: IntoIterator<Item = Elmt>,
Elmt: Ord,
{
fn get_min(&self) -> Elmt {
let mut iter = self.into_iter();
match iter.next() {
None => panic!("Empty List"),
Some(x) => iter.fold(x, |acc, y| acc.min(y)),
}
}
}
Run Code Online (Sandbox Code Playgroud)
在这里,我要求类型T满足以下属性:它的任何引用都必须实现IntoIterator<Item = Ord>. 这段代码无法编译,因为 Rust 想要&T有一个生命周期,而我不知道为什么。该where子句应该只确保某些东西是某种类型,这是在编译时完成的。生命周期/引用是如何产生的?确保&T实现类型的T实现IntoIterator与悬空指针或内存泄漏无关。
来自 Rust Discord 的人帮助我完成了这个工作:
trait Min<'a, Elmt> {
fn get_min(&'a self) -> Elmt;
}
impl<'a, T, Elmt> Min<'a, Elmt> for T
where
&'a T: IntoIterator<Item = Elmt> + 'a,
Elmt: Ord,
{
fn get_min(&'a self) -> Elmt {
let mut iter = self.into_iter();
match iter.next() {
None => panic!("Empty List"),
Some(x) => iter.fold(x, |acc, y| acc.min(y)),
}
}
}
Run Code Online (Sandbox Code Playgroud)
(游乐场变体)
他们试图向我解释,但我无法理解,所以我正在寻找另一种解释来进入我的大脑。
让我一一介绍:
&'a T: IntoIterator<Item = Elmt> + 'a,我们给泛型引用&T一个生命周期'a。为什么需要这个?为什么我们要限制&'a T到生命周期'a?我的意思是这不是同义反复吗?
由于我们在where子句中使用了生命周期,因此我们必须将其添加到某个签名中。那是impl<'a, T, Elmt>从哪里来的 - 很好
为什么特征Min和get_min()函数现在需要生命周期参数?生命周期省略应该给每个输入元素一个生命周期,而输出无论如何都没有生命周期。
我想,如果我知道什么样的特征可能帮助是/他们是如何实现的。对象基本上是变量和方法指针的列表。特征中的方法是否简单地附加到每个实现对象的方法指针?它们是否以某种方式分离对象?他们真的有一辈子吗?哪辈子?我从不Min使用let a = Trait::new()语法分配“一般特征” ,那么它怎么会有生命周期呢?
解决for<>-implementation 注释:
虽然 trait 和实现将在for<'a>生命周期绑定的情况下编译&T,但结果不可用。由于&Vec显然不满足特征界限(参见这个操场)。这也在 Discord 讨论中提出,我也不了解for<>语法,但我认为这可能超出了这个问题的范围。
| 归档时间: |
|
| 查看次数: |
118 次 |
| 最近记录: |