引用的生命周期如何大于其指向的类型的生命周期?

How can lifetime of reference larger than the lifetime of the type its pointing to?

我正在使用这段代码来更好地理解生命周期和省略。此代码编译。

struct Bytes<'a>(&'a [u8]);

impl<'a> Bytes<'a> {
    fn first_two<'b>(self: &'b Bytes<'a>) -> &'b [u8] 
        where 'b: 'a
    {
        &self.0[..2]
    }
}

where 界限 'b: 'a 如何被 self 接受? self 不应该总是另一种方式有效吗?

而 return 值指向 Bytes 内的切片,其生命周期为 'a 。那么,如果 'b 可以比 'a 长寿,那么输出如何具有生命周期 'b

重要的是要注意代码 compiles 即使您完全删除了 where 子句,这应该会删除两个生命周期之间的任何关系。为什么 允许?

我认为 self: &'b Bytes<'a> 参数的存在意味着 'a: 'b 的约束。对于首先存在的任何 Bytes<'a> 值,调用者必须确保 Bytes 引用的 'a 至少与 Bytes 值本身一样长 - 因此 'a: 'b。换句话说,与原始 'a 相比,returning &'b [u8] 实际上 减少了 生命周期,这始终是允许的。

到 return 你的代码,当你进一步添加 'b: 'a 时,你告诉 Rust 除了 'a 至少活到 [=22] 的要求之外=],而且 'b 必须至少与 'a 一样长。换句话说,'b'a 必须具有相同的生命周期 - 这再次使 return &'b [u8] 可以,因为它与 &'a [u8] 相同。

How can the where bound 'b: 'a be acceptable for self? Shouldnt it always be the other way for self to be valid?

准确地说 - self 应该是相反的,这样 return &'b [u8] 就可以了。如上所述,添加看似“逆向”的约束并不能消除第一个约束,它只会使关系更加严格。 (这就像知道 a >= b 对于两个数字,并进一步规定 b <= a - 这两个归结为 a == b。)