此代码基于“生命周期”章节中“锈蚀”一书中的示例代码。我想知道相同方法的以下两个版本有何不同:
struct Important<'a> {
part: &'a str,
}
impl<'a> Important<'a> {
fn larger<'b>(&'b self, other: &'b str) -> &'b str {
if self.part.len() > other.len() {
self.part
} else {
other
}
}
}对比
struct Important<'a> {
part: &'a str,
}
impl<'a> Important<'a> {
fn larger(&self, other: &'a str) -> &str {
if self.part.len() > other.len() {
self.part
} else {
other
}
}
}我猜在第一个版本中,我们正在指示编译器
'b,这样&self和引用other在它期间都是有效的(如果它们重叠,则可能是两个生命周期中的较短时间)'b中使用,因为它外部可能成为一个悬空引用。代码的第二个版本是做什么的?Rust书中的生存期省略规则之一是,在struct方法中,返回的引用被指定为&self参数的生存期(此处为'a ),因此,我们是否认为other在与&self参数相同的生命周期中也是有效的,即生存期'a。
从语义上讲,这是相同的代码,还是根据other和结构的生命周期,这些版本的行为会有所不同?
发布于 2020-12-12 17:38:10
第二个版本的代码是做什么的?锈蚀书中的生命周期省略规则之一说,在struct方法中,返回的引用被指定为&self参数的生存期(此处为
'a),因此,我们是否认为其他参数也应该与&self参数(即生命周期'a)的生存期相同?
这有点不准确,在第二个示例中,&self的生存期不是'a,而是受'a限制的。如果我们通过逆转Rust的生命周期省略规则来扩展它,那么第二个示例将对此进行扩展:
struct Important<'a> {
part: &'a str,
}
impl<'a> Important<'a> {
fn larger<'b>(self: &'b Important<'a>, other: &'a str) -> &'b str {
if self.part.len() > other.len() {
self.part
} else {
other
}
}
}self被'a限制的原因是因为&'b Important<'a>暗示了'b: 'a,或者简单地说,"__'a超过'b__“,这必须是正确的,否则引用可能会失效。如果我们展开第一个示例,self的类型再次变成&'b Important<'a>。第一个和第二个例子之间唯一的区别是other的类型,在第一个是&'b str,在第二个是&'a str,但是这是一个无关的细节,因为返回值的类型&'b str受'b生存期的约束,我们知道'b: 'a在功能上都是相同的。
https://stackoverflow.com/questions/65266935
复制相似问题