当前位置: 首页 > 知识库问答 >
问题:

结构方法的生锈寿命推断

陈昊昊
2023-03-14

代码基于生存期章节中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内使用,因为在该生命周期之外,它可能会成为悬空引用。

    代码的第二个版本是做什么的?Rust书中的生命周期省略规则之一说,在结构方法中,返回的引用被分配了的生命周期

    从语义上讲,这是相同的代码还是这些版本的行为会因其他和结构的生命周期而异?


  • 共有1个答案

    湛宏旷
    2023-03-14

    代码的第二个版本做什么?rust book中的一条生存期省略规则指出,在结构方法中,返回的引用被分配了

    这有点不准确,的生命周期

    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为界,是因为

     类似资料:
    • 我已经在锈菌上试验了很长时间了。关于铁锈的寿命有一种混淆。查看以下代码: string2的生存期在内部作用域之后结束,结果在外部作用域中定义。在println!中传递结果时!,编译不会抱怨,而是继续并打印结果。但是,当我将string2更改为: 借书人会投诉的。为什么会这样。

    • 我有一个问题与生命周期参数的结构。我不能100%确定如何描述这个问题,但是我创建了一个显示编译时错误的简单案例。 我得到的错误是 我尝试了很多变体,只是无法编译这个东西。我在这里找到了另一个帖子(如何修复:预期的具体寿命,但找到了绑定的寿命参数),但似乎绕过了问题,而不是解决它。我真的不明白为什么这个问题会出现。该 有什么想法吗?谢谢你的帮助。

    • 我正在尝试在结构中存储函数: 编译器抱怨:

    • 在结构体中标注生命周期也和函数的类似: // 一个 `Borrowed` 类型,含有一个指向 `i32` 类型的引用。 // 指向 `i32` 的引用必须比 `Borrowed` 寿命更长。 // (原望:A type `Borrowed` which houses a reference to an // `i32`. The reference to `i32` must outlive `B

    • 我目前正试图理解两者之间的区别

    • 刚刚读完《铁锈书》中关于生命的章节。 所有的东西都是有意义的,特别是一个主要的例子是下面的不会编译 这是因为“我们告诉Rust,最长函数返回的引用的生存期与传入的引用的生存期中的较小者相同。因此,借用检查器不允许清单10-24中的代码具有无效引用。”在本章的另一部分中,“最长函数返回的引用的生存期与传入的引用的生存期中较小者相同。” 因此,很自然地,我会尝试给出我自己的简化示例,如下所示 令我惊讶