Rust 锈蚀寿命是否仅参考参考文献?
我试着把我的脑袋绕到锈迹斑斑的一生(因为官方指南并没有很好地解释它们)Rust 锈蚀寿命是否仅参考参考文献?,rust,Rust,我试着把我的脑袋绕到锈迹斑斑的一生(因为官方指南并没有很好地解释它们) 锈寿命是否只引用引用,或者它们是否也可以引用基值/基元值?是的,它们只引用引用,但是这些引用可以引用基元类型。Rust不像Java(和类似的语言)那样区分按值传递的基本类型和按引用传递的更复杂类型(Java中的对象)。复杂类型可以在堆栈上分配并按值传递,并且可以引用基元类型 例如,下面是一个函数,它接受对i32的两个引用,并返回对较大引用的引用: fn bigger<'a>(a: &'a i32, b:
锈寿命是否只引用引用,或者它们是否也可以引用基值/基元值?是的,它们只引用引用,但是这些引用可以引用基元类型。Rust不像Java(和类似的语言)那样区分按值传递的基本类型和按引用传递的更复杂类型(Java中的对象)。复杂类型可以在堆栈上分配并按值传递,并且可以引用基元类型 例如,下面是一个函数,它接受对
i32
的两个引用,并返回对较大引用的引用:
fn bigger<'a>(a: &'a i32, b: &'a i32) -> &'a i32 {
if a > b { a } else { b }
}
fn更大的b{a}其他{b}
}
它使用生存期
'a
来传达返回引用的生存期与传入引用的生存期相同。否,它们也引用值。如果从上下文看不清楚他们会活多久,那么也必须对他们进行注释。然后,它被称为终身限制
在以下示例中,有必要指定引用所引用的值的寿命至少与引用本身的寿命相同:
use std::num::Primitive;
struct Foo<'a, T: Primitive + 'a> {
a: &'a T
}
使用std::num::Primitive;
结构Foo{
答&'
}
尝试删除
+'a
,编译器会抱怨。这是必需的,因为T
可以是任何实现原语的东西生命周期是值和对所述值的引用之间的链接
为了理解这个链接,我将使用一个断开的平行词:房屋和地址
房子是一个实体。它在某个时候建在一块土地上,可以存活几十年或几百年,在此期间可能会被翻修多次,并且很可能在某个时候被摧毁
地址是一个逻辑实体,它可以指向房屋或其他物理实体(田地、学校、火车站、公司总部等)
房子的寿命是相对清晰的:它表示房子从建成到被摧毁的这段时间内可用的时间。在这段时间里,这座房子可能会经历几次翻修,曾经是一个简单的小屋可能最终成为一个成熟的庄园,但这与我们无关;就我们的目的而言,这座房子在这些转变中一直存在。只有它的创造和最终的毁灭才重要。。。即使当我们拆掉屋顶时,如果没有人碰巧在卧室里可能会更好
现在,假设你是一名房地产经纪人。你不把你卖的房子放在办公室里,这是不切实际的;但是,你要保留他们的地址
如果没有生命周期的概念,你的客户会不时地抱怨,因为你发送给他们的地址。。。是一个垃圾场的地址,而不是你拍的那栋可爱的两层楼的房子。你也可能会从警察局得到一些询问,询问为什么有人拿着你办公室的小册子被发现在一所刚刚被摧毁的房子里,随后的诉讼可能会关闭你的生意
这显然会给您的业务带来风险,因此您应该寻求更好的解决方案。如果每个地址都可以标记它所指的房子的使用寿命,这样你就知道不会让人们送命(或失望),那会怎么样
您可能已经在该垃圾转储中识别出C手动内存管理策略;在C语言中,由你,房地产代理开发商,来确保你的地址(指针/参考)总是指住的房子
然而,在Rust中,引用用一个特殊的标记进行标记:“够了”
;它表示引用的值的生存期的下限
当编译器检查您对引用的使用是否安全时,它会提出以下问题:
价值是否仍然存在
不管该值是否会存在100年,只要它的使用寿命足够长。当你在代码中看到一个终生注释(例如,'a
)时,几乎总是会涉及一个引用或借用的指针
借用指针的完整语法是和'at
<代码>'a
是引用对象的生存期T
是引用对象的类型
结构和枚举可以具有生存期参数。这通常是包含借用指针的结构或枚举的结果。在结构或枚举中存储借用的指针时,必须显式声明引用对象的生存期。例如,标准库中的枚举在其变体中包含借用的指针。因此,它有一个生存期参数,在借用指针的类型中用于定义引用对象的生存期
特征可以有类型界限,也可以有终生界限。生存期界限表示该特性的具体实现中所有借用指针有效的最大区域(即它们的引用是活动的)。如果实现不包含借用的
指针,则生存期被推断为静态的。生存期界限可以出现在类型参数定义、where
子句和trait对象中
有时,您可能希望使用生存期参数定义结构或枚举,但没有相应的借用值。您可以使用标记类型,例如,以确保lifetime参数具有适当的方差(ContravariantLifetime
对应于借用指针的方差;如果没有标记,则生存期将是双变量的,这意味着生存期可以用任何其他生存期替换…不是很有用!) 引用是真正安全的类型化指针