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

3

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

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

如何使得绑定到“b: 'a”的whereself可接受?难道对于self来说,它不应该总是反过来才有效吗?
返回值指向Bytes内部的切片,其生命周期为'a。如果'b的寿命可以超过'a,那么输出如何具有生命周期'b

1
也许你只是把它反过来看了? 把 : 看作“比...寿命长”。 因此,'a: 'b 的意思是“'a'b 寿命长”。 'a 必须比 'b 寿命长,才能使 &'b Bytes<'a> 成为良构的。 - trent
@trentcl 你说得对。我在写问题时搞混了。我交换了边界但它仍然能编译。 - raj
1
我非常确定&'b Bytes<'a>隐含地导致了'a: 'b,考虑到你的显式声明'b: 'a,实质上要求'a = 'b(因此引发疑问为什么要引入'b生命周期参数,而不是始终使用'a). - eggyal
1个回答

4
需要翻译的内容:

需要注意的是,即使您完全删除where从句,代码仍然可以编译,这应该消除了两个生命周期之间的任何关系。为什么会容许这样做呢?

我认为发生的情况是,self:&'b Bytes<'a>参数的存在本身就意味着'a:'b的约束条件。对于任何Bytes<'a>值,其调用者必须确保由Bytes引用的'a至少与Bytes本身一样长寿 - 因此'a:'b。换句话说,返回&'b [u8]实际上比原始的'a寿命更短,这总是可以的。

回到您的代码,当您进一步添加'b:'a时,您告诉Rust,除了要求'a至少与'b具有相同的寿命外,还要求'b至少与'a一样长。换句话说,'b'a必须是同一个生命周期-因此,返回&'b [u8]是可以的,因为它与&'a [u8]相同。

where约束'b:'a如何适用于self?自身不总是有效时应该总是反过来吧?

确切地说-对于self而言,它应该反过来才有效,这使得返回&'b [u8]成为可能。如上所述,添加表面上“相反”的约束并不会使第一个约束消失,它只会使关系更严格。 (就像知道两个数字的a>= b,并进一步规定b<= a一样-两者归结为a == b。)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接