我可以避免使用显式生命周期说明符而使用引用计数 (Rc) 吗?

Nur*_*yev 3 reference reference-counting lifetime rust borrowing

我正在阅读 Rust Book,所有内容都很容易理解(感谢这本书的作者),直到关于生命周期的部分。我花了一整天,阅读了很多关于生命的文章,但我仍然对正确使用它们感到非常不安。

不过,我确实理解的是,显式生命周期说明符的概念旨在解决悬空引用的问题。我也知道 Rust 有引用计数智能指针 ( Rc),我相信它与shared_ptrC++ 中的相同,具有相同的目的:防止悬空引用。

鉴于这些生命周期对我来说是如此可怕,而且智能指针对我来说非常熟悉和舒适(我在 C++ 中经常使用它们),我可以避免使用智能指针的生命周期吗?还是生命周期是我必须在 Rust 代码中理解和使用的不可避免的事情?

Pet*_*all 6

生命周期是我必须在 Rust 代码中理解和使用的不可避免的事情吗?

为了阅读现有的 Rust 代码,您可能不需要了解生命周期。借用检查器理解它们,因此如果它可以编译,那么它们是正确的,您只需查看代码的作用即可。

我对正确使用它们非常不安全。

关于生命周期注解,最重要的一点是它们什么都不。相反,它们是向编译器表达引用之间关系的一种方式。例如,如果一个函数的输入和输出具有相同的生命周期,这意味着输出包含对输入(或其中一部分)的引用,因此不允许比输入存活更长时间。“错误地”使用它们意味着您正在告诉编译器有关引用的生命周期的一些信息,但它可能被证明是不真实的 - 它会给您一个错误,因此没有什么可不安全的!

我可以避免使用智能指针的生命周期吗?

可以选择完全避免使用引用并Rc在任何地方使用。你会错过 Rust 的一大特性:生命周期和引用构成了最重要的零成本抽象之一,它使 Rust 同时快速和安全。有一些用 Rust 编写的代码,没有人会尝试用 C/C++ 编写,因为人类永远无法绝对确定他们没有引入内存错误。避免 Rust 引用而使用智能指针通常会导致代码变慢,因为智能指针有运行时开销。

许多 API 使用引用。为了使用这些 API,您至少需要对正在发生的事情有所了解。

最好的理解方法就是编写代码并从哪些有效哪些无效中获得直觉。Rust 的错误信息非常好,对形成这种直觉有​​很大帮助。

  • 两个字:不。超过 70 个字...类型检查器(包括借用检查器)不会超出函数类型边界。当您编写函数类型签名时,您正在声明一个双向契约,函数体和任何调用者都必须遵循该契约。类型检查员独立证明合同双方均得到履行。尊重类型边界是 Rust 和大多数其他类型语言的主要抽象,打破它会导致代码脆弱。 (3认同)
  • @NurbolAlpysbayev您可能会发现阅读[为什么Rust需要显式生命周期?](/sf/ask/2212639621/)很有帮助 (3认同)