gpt4 book ai didi

methods - 结构方法的Rust生命周期推断

转载 作者:行者123 更新时间:2023-12-03 11:33:43 25 4
gpt4 key购买 nike

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

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和struct的生存期?

    最佳答案

    What does the second version of the code do? One of the lifetime elision rules in the rust book says that in a struct method the returned reference is assigned the lifetime of the &self parameter (which is 'a here), so are we saying that other should also be valid for the same lifetime as the &self parameter, which is the lifetime '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
    }
    }
    }
    自我受 'a限制的原因是因为 &'b Important<'a>暗含了 'b: 'a或用简单的术语“ 'a超过 'b”,该字段必须为true,否则引用可能无效。如果我们扩展第一个示例,则 self的类型再次变为 &'b Important<'a>。第一个示例和第二个示例之间的唯一区别是 other的类型,第一个是 &'b str,第二个是 &'a str,但这是不相关的细节,因为返回值的类型为 &'b str,受 'b生命周期的约束,我们知道 'b: 'a,因此在功能上,两个示例都相同。

    关于methods - 结构方法的Rust生命周期推断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65266935/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com