Rust 锈蚀寿命是否会影响已编译程序的语义?

Rust 锈蚀寿命是否会影响已编译程序的语义?,rust,Rust,我试图在锈迹中摸索生命周期,并问自己它们是否“只是”一种安全措施(以及在出现错误时如何确保安全的一种沟通方式),或者是否存在生命周期的不同选择实际改变程序运行方式的情况,即生命周期是否对已编译程序产生语义差异 至于“寿命”,我指的是所有让借书人高兴的讨厌的小'a,'b,'static标记。当然,写作 { let foo = File::open("foo.txt")?; } foo.write_all(b"bar"); 而不是 let foo = File::open("foo.tx

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

至于“寿命”,我指的是所有让借书人高兴的讨厌的小
'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++中也会发生这种范围和析构函数调用。

< P>不,寿命不会以任何方式影响生成的机器代码。归根结底,这些都是指向已编译代码的“指针”

因为我们是说人类语言的人,所以我们倾向于将两个不同但相关的概念放在一起:具体的寿命和通用的寿命参数

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


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

具体生命周期和泛型生命周期参数之间的区别非常有用。对于这两个词,我使用了相同的词,到目前为止我读到的解释也将这两个概念混合在一起。@Perseids老实说,我不确定这些是公认的术语,但我正在尽我所能使它们成为公认的术语。^ ^我也试图在模棱两可时更好地表达其中一种,但只说“life”真是太方便了。我们可能会陷入困境,但澄清所有编程语言都有具体的生命周期这一说法可能是有用的。当使用垃圾收集时,生命期实际上可以动态扩展,而Rust的生命期参数所描述的生命期则不是这种情况,它仅仅是编译时构造(您必须像垃圾收集语言一样使用
Rc
指针进行动态生命期扩展)@B.Striegel:在不接触
Rc
的情况下,
String
的缓冲区在返回
字符串时可以看到其生存期“延长”。