Rust 我是否可以避免使用显式生存期说明符,而是使用引用计数(Rc)?

Rust 我是否可以避免使用显式生存期说明符,而是使用引用计数(Rc)?,rust,reference,lifetime,reference-counting,borrowing,Rust,Reference,Lifetime,Reference Counting,Borrowing,我正在读《铁锈》这本书,所有的东西都很简单易懂(多亏了书的作者),直到关于这本书的章节。我花了一整天的时间,读了很多关于生命的文章,但我仍然对正确使用它们很不放心 不过,我真正理解的是,显式生命周期说明符的概念旨在解决悬空引用的问题。我也知道RIST有引用计数智能指针( RC >),我相信它与C++中的代码>共享StRypPT/相同,它的目的相同:防止悬空引用。 P>因为那些生命对我来说是如此可怕,而智能指针对我来说是非常熟悉和舒适的(我在C++中使用了很多),我能避免使用智能指针的生命吗?

我正在读《铁锈》这本书,所有的东西都很简单易懂(多亏了书的作者),直到关于这本书的章节。我花了一整天的时间,读了很多关于生命的文章,但我仍然对正确使用它们很不放心

不过,我真正理解的是,显式生命周期说明符的概念旨在解决悬空引用的问题。我也知道RIST有引用计数智能指针(<代码> RC <代码> >),我相信它与C++中的代码>共享StRypPT/<代码>相同,它的目的相同:防止悬空引用。 <> P>因为那些生命对我来说是如此可怕,而智能指针对我来说是非常熟悉和舒适的(我在C++中使用了很多),我能避免使用智能指针的生命吗?或者生命周期是我必须理解并在锈代码中使用的不可避免的事情

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

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

我对正确使用它们很不放心

生命周期注释最重要的一点是它们什么都不做。相反,它们是向编译器表示引用之间关系的一种方式。例如,如果函数的输入和输出具有相同的生存期,这意味着输出包含对输入(或其一部分)的引用,因此不允许生存期长于输入。“不正确地”使用它们意味着您正在告诉编译器某个引用的生存期,而该引用的生存期可能被证明是不真实的—并且它将给您一个错误,因此没有什么不安全的

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

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

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


理解的最好方法就是编写代码,从有效和无效中获得直觉。Rust的错误消息非常好,将有助于形成这种直觉。

在某种程度上,您可以在代码中使用引用计数指针来避免终生注释。然而,在处理别人的板条箱时,你不能总是避开它们(实际上总是这样)。更重要的是,您的代码将与生锈的要点背道而驰,您将遇到各种各样的复杂性,这些复杂性甚至更难处理。因此,简短的回答可能是“否”。您可以使用引用计数指针,但这些指针实际上只是将生存期问题转移到运行时,而不是编译时,为了方便起见牺牲了性能。也有一些情况下它们不起作用-例如,当需要独占/可变访问时。我建议学习使用生命周期,而不是依赖于引用计数指针——它们不同,更难理解,但它们是许多更高级别的生锈概念的基础,您无法长时间避免它们。非常感谢!这给了我一些信心和方向,我想我会进一步尝试去把握人生。在一些睡眠之后。。。彼得,你们能用两个词解释一下为什么编译器要求我注释生命周期,即使它能证明它们的正确性?如果它这么聪明的话,没有我的帮助它为什么不“注释”它们呢?用两个词:不。用70多个词。。。类型检查器(包括借用检查器)不会查看函数类型边界之外的内容。编写函数类型签名时,您声明的是一个双面约定,函数体和任何调用方都必须遵循该约定。打字员独立证明合同双方均已履行。尊重类型边界是Rust(以及大多数其他类型语言)中的一个主要抽象,打破它会导致代码脆弱。我不擅长编写编程语言,但感觉他们可以通过分析函数每次调用的参数来进行这种类型的检查(即,查看函数边界之外的内容)。不过,我相信他们在这方面存在一些技术障碍。无论如何,非常感谢你(花了70多个字在我身上:-),非常通俗易懂的解释@努尔博拉皮斯巴耶夫你可能会发现阅读这本书很有帮助