首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >结构方法的锈蚀寿命推断

结构方法的锈蚀寿命推断
EN

Stack Overflow用户
提问于 2020-12-12 15:56:16
回答 1查看 337关注 0票数 1

此代码基于“生命周期”章节中“锈蚀”一书中的示例代码。我想知道相同方法的以下两个版本有何不同:

代码语言:javascript
复制
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
        }
    }
}

对比

代码语言:javascript
复制
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
        }
    }
}

我猜在第一个版本中,我们正在指示编译器

  1. 找到一个生命周期'b,这样&self和引用other在它期间都是有效的(如果它们重叠,则可能是两个生命周期中的较短时间)

  1. 确保返回的引用仅在该生存期'b中使用,因为它外部可能成为一个悬空引用。

代码的第二个版本是做什么的?Rust书中的生存期省略规则之一是,在struct方法中,返回的引用被指定为&self参数的生存期(此处为'a ),因此,我们是否认为other在与&self参数相同的生命周期中也是有效的,即生存期'a

从语义上讲,这是相同的代码,还是根据other和结构的生命周期,这些版本的行为会有所不同?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-12-12 17:38:10

第二个版本的代码是做什么的?锈蚀书中的生命周期省略规则之一说,在struct方法中,返回的引用被指定为&self参数的生存期(此处为'a ),因此,我们是否认为其他参数也应该与&self参数(即生命周期'a )的生存期相同?

这有点不准确,在第二个示例中,&self的生存期不是'a,而是受'a限制的。如果我们通过逆转Rust的生命周期省略规则来扩展它,那么第二个示例将对此进行扩展:

代码语言:javascript
复制
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在功能上都是相同的。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65266935

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档