引用的生命周期如何大于其指向的类型的生命周期?
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
。)
我正在使用这段代码来更好地理解生命周期和省略。此代码编译。
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 forself
? Shouldnt it always be the other way for self to be valid?
准确地说 - self
应该是相反的,这样 return &'b [u8]
就可以了。如上所述,添加看似“逆向”的约束并不能消除第一个约束,它只会使关系更加严格。 (这就像知道 a >= b
对于两个数字,并进一步规定 b <= a
- 这两个归结为 a == b
。)