gpt4 book ai didi

rust - 什么时候需要使用生命周期?

转载 作者:行者123 更新时间:2023-11-29 08:05:13 24 4
gpt4 key购买 nike

我仔细阅读了生命周期,了解到每个变量绑定(bind)都有生命周期。然而,我似乎想不出您实际需要使用它们的时间,考虑到编译器在必要时推断它们方面做得非常出色。

Rust 书,我读过。我想要一个简单易懂的示例,即使对于像我这样的人也是如此!

最佳答案

当一个变量(有一些生命周期)引用另一个具有不同生命周期的变量时,我们在 Rust 中使用生命周期参数

让我们考虑这两个语句:

let i = 42;
let ref_i = &i;

在这里,i有一些生命周期,并且ref_i有一些其他的生命。但是,ref_i 的类型编码 i 的生命周期(或它的某种近似值是合理的);借用指针的类型写成&'a T , 和 'a是指针所指对象的生命周期。

借用的指针只能引用比指针的生命周期的值。如果不是这种情况,那么指针最终会悬空,即它会引用一个不再存在的值。编译器会自动为您验证这一点(只要您不编写 unsafe 代码);这是其他系统编程语言(如 C++)所不具备的。但是为了验证这一点,编译器必须知道指针指向的值的生命周期;这就是为什么我们在 Rust 中有生命周期参数。幸运的是,编译器还可以在许多情况下推断生命周期,因此在这些情况下它是透明的。

根据设计,Rust 只会进行本地类型推断。编译函数时,编译器不会检查其他函数或其他类型的主体来验证第一个函数是否正确;它只查看他们的签名。对于函数,我们有省略规则,这些规则指示我们何时可以省略显式生命周期参数以及编译器将推断它们的内容。对于结构,我们总是必须明确提及它们,因为我们几乎总是需要将结构上的生命周期参数与其他一些项目相关联(例如,特征实现中特征的生命周期参数,或方法的返回类型),由于编译器只进行局部类型推断,我们需要在签名中显式编码这种相关性。

这是一个包含借用的结构的简单示例:

struct Wrapper<'a>(&'a str);

impl<'a> Wrapper<'a> {
fn extract(self) -> &'a str {
self.0
}
}

首先,在结构定义上,我们需要为字符串切片引入一个生命周期参数。然后,我们需要参数化 impl因为Wrapper需要一个生命周期参数('a 中的 impl<'a> 定义 生命周期参数,'a 中的 Wrapper<'a> 使用 生命周期参数)。在 extract ,我们可以引用'a impl 上定义的生命周期参数以便函数的返回类型与 self.0 的实际类型匹配.

关于rust - 什么时候需要使用生命周期?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41654864/

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