我试图在 rust 迹中摸索生命周期,并问自己它们是否"只是"一种安全措施(以及在出现错误的情况下如何确保安全的一种沟通方式),或者是否存在生命周期的不同 Select 实际改变程序运行方式的情况,即生命周期是否对已编译程序产生语义差异.

在"一生"中,我指的是所有让借书人开心的讨厌的小'a'b'static标记.当然,写作

{
    let foo = File::open("foo.txt")?;
} 
foo.write_all(b"bar");

而不是

let foo = File::open("foo.txt")?;
foo.write_all(b"bar");

在写入发生之前,文件关闭描述符将被关闭,即使我们可以访问FoO,但是C++中也会发生这种范围和析构函数调用.

推荐答案

不,生命周期不会以任何方式影响生成的机器代码.归根结底,这些都是指向已编译代码的"指针".

因为我们是说人类语言的人,所以我们倾向于把两个不同但相关的概念放在一起:concrete lifetimesgeneric lifetime parameters.

All种编程语言都有具体的生命周期.这只对应于资源将被释放的时间.这就是你的例子,事实上,C++和 rust 一样工作.这通常被称为资源获取即初始化(RAII).垃圾收集语言也有生命周期,但它们可能更难确切地确定何时结束.

使这一领域的 rust 迹整洁的是通用生命周期 参数,我们称之为'a'static.这些允许编译器跟踪底层指针,这样程序员就不必担心指针是否会保持足够长的有效时间.这适用于在 struct 中存储引用,并在函数之间传递引用.

Rust相关问答推荐

抽象RUST中的可变/不可变引用

为什么允许我们将可变引用转换为不可变引用?

使用Box优化可选的已知长度数组的内存分配

S在Cargo.toml中添加工作空间开发依赖关系的正确方法是什么?

关于 map 闭合求和的问题

使用关联类型重写时特征的实现冲突

应为关联类型,找到类型参数

减少指示ProgressBar在Rust中的开销

为什么在 Allocator API 中 allocate() 使用 `[u8]` 而 deallocate 使用 `u8` ?

使用 Option 来分配?

一次不能多次borrow *obj作为可变对象

`use` 和 `crate` 关键字在 Rust 项目中效果不佳

注释闭包参数强调使用高阶排定特征界限

是否可以通过可变引用推进可变切片?

使用 lalrpop 在 rust 中解析由 " 引用的字符串

为什么会出现无法移出可变引用后面的 `self.x`错误?

第 7.4 章片段中如何定义 `thread_rng`

没有分号的返回表达式的性能是否比使用返回更好?在Rust ?

Abortable:悬而未决的期货?

制作嵌套迭代器的迭代器