这个 Rust 生命周期示例的理解

3

我是一个Rust新手,仍然在为Rust中的生存期而奋斗。以下是我正在阅读的一本书中的示例。有人能帮忙解释一下为什么作者可以通过查看函数签名就获取此信息吗?我已经基本了解了借用、引用等,但仍然无法理解。

例如,假设我们有一个解析函数,它接受字节切片并返回一个结构,其中包含解析结果:

fn parse_record<'i>(input: &'i [u8]) -> Record<'i> { ... }

不需要查看Record类型的定义,我们可以得出结论:如果我们从parse_record接收一个Record,无论它包含哪些引用,这些引用都必须指向我们传入的输入缓冲区,并且不指向其他地方(除了可能是“静态值”)。

我不确定,因此我进行评论,但是这个信息可能可以从显式生命周期'i中推导出来。由于Rust不允许返回对局部变量的引用,并且Recordinput具有相同的生命周期,这意味着Record中的任何内容都必须来自于input - GrayCat
将生命周期视为作用域;具有该生命周期的值将在作用域结束时被丢弃。因此,如果我们说 Record 应该与作用域中名为 'i 的值一样长寿,我们就得到了 Record<'i> - Optimistic Peach
2个回答

4
Record只能从函数体中获取引用。理论上,这些可以来自于:
  • input中的值,这些都是生命周期为'i的引用
  • parse_record之外定义的值,这些必须具有'static生命周期
  • parse_record中定义的值。这些可以是:
    • 动态创建的。这些值将在函数范围结束时被丢弃,因此对它们的任何引用都将成为悬空指针。因此,编译器不允许这样做。
    • 字面量(1"cat")。这些实际上已经嵌入到二进制文件中,因此在函数中它们是'static引用。

2

输入:

input: &'i [u8]

内容如下:

我是一个字节序列([u8])的引用,将至少与 'i 一样长寿。

所以,当说我有一个类型看起来像这样:Record<'i>,我可以这样描述它:

我是一个结构体(命名为Record<'i>),包含某些东西(可能是一个引用,也可能是其他东西),这取决于在 'i 至少存活的某些人物。

关于引用/结构体/枚举/任何东西的生命周期,告诉你的是:存在一个依赖关系,即在 'i 中存在的对象必须和我一样长寿。

换句话说,此函数签名告诉你,Record 必须与由 input 引用的字节序列(u8 的引用下面的 字节,而不是引用本身)一样长寿。


最近已经弃用了缺少生命周期参数,现在会导致警告,因此请注意阅读以下示例时:
fn parse_record(input: &[u8]) -> Record

可能会有一个与Record相关联的生命周期,因此您必须查阅某种文档。编译器将其解开(并且警告要求您自己执行此操作),变成了这样:

fn parse_record(input: &'_ [u8]) -> Record<'_>

这与你的 'i' 示例完全相同。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接