大多数语言中的常数和变量之间存在区别。在许多语言中,常数表明堆栈没有变化,但是堆的变量,例如:
尽管大多数开发人员不需要关心Java中的堆栈和堆之间的差异,但实际上,“恒定变量”的特征可能会导致某些问题。在某些情况下例如,没有可变:
可以看出,当试图调用编译器提示错误时。
实际上,尽管Let's陈述的变量没有变化,但可以重复进行,例如:
随着GC越来越多的语言,开发人员无法再关注资源所有权的问题。但是在C语言或C ++中,如何处理资源所有权是一个非常重要且困难的问题。大多数C/C ++将因内存或野生指针(悬挂指针)而困扰。他们中的大多数是因为:
由于资源使用问题太复杂了,因此随后的语言基本上是通过资源恢复来解决的。开发人员不需要关心资源的回收,而是要分析需要释放哪些资源并通过GC释放这些资源语言本身。尽管GC解决了开发人员管理资源的问题,但分析和发布都有一定的性能损失。RUST使用另一种方法来处理这些问题。非常明确的声明周期和所有权的概念定义了生锈以确保在写作过程中可以解决C/C ++中的资源管理问题。
Rust中的所有资源都有,只有一个所有者。Rust中声明的变量不是资源本身,而是对资源的引用。请注意,这里提到的引用只是一个概念,而不是在RustQuote变量中指的是:
从错误提示中可以看出,S1拥有的资源移动(移动)已被授予S2。它不再拥有自己的资源,因此不能使用。可以看出,生锈的资源管理非常严格,不允许出现两个所有者。这对多线程编程非常有益。资源运动,我们必须重新检查其他语言的一些常规概念。这是一个伪代码:
让我们分析这些场景如何分别在Rust中实现。
首先,在生锈中,调用该函数时的传递参数也会传输资源:
也就是说,如果变量传递到函数,则将变量的资源传输,并且在调用函数后无法访问变量。如果调用函数,此函数将返回一个持有资源的变量,资源将会转移:
但是显然有很多不便。
这显然是一种非常优雅的行为,因此参考的概念是在Rust中提出的。引用不具有资源,他只是访问了该资源的媒介:
在RUST中使用来创建参考。t型引用为&t。因此,这里的S2类型是。可以看到,在将S1分配给S2至S1之后,S1将在被引用后拥有自己的资源。我们可以使用参考优化我们的方法:
通过这种方式,我们将不会重复资源。作为参考文献和非参考的生活周期的章节,将对生命周期的章节进行详细分析。在Rust中创建参考文献的过程称为借用。但是在现实生活中借贷和借贷仍然存在一定的差异。播放B借A的资源,因此资源流动经常发生。但是在Rust中,借贷在真实的资源运动中不存在。方向需要称为mut的变量,参考也必须是mut:
生锈不允许两个可变的参考相同的变量:
您甚至不能同时提及可变和不可变的。当然,有一种特殊的情况。如果不变的借口在可变之前借用,并且以后将不使用,则也允许这样做:
切片以多种语言用于拦截集合类型数据的一部分,例如在Python中:
但是Rust对所有权具有非常严格的控制权,因此当我们使用切片时,是否需要转移资源的切割部分?Rust的切片中有单独的类型和切片。其他重点是要注意。切片类型不能直接使用,因为它代表了真实的资源。
对于T型Tlic类型,切片参考类型为。
绳子和切片生锈中的弦可能最容易使初学者混淆。有这些类型的字符串:
首先,使用字符串的直接分配或切片的类型用于使用字符串切片类型。这与一般集合类型不同。我们创建的类型是直接持有字符串资源的类型,可以修改该字符串资源按字符串。在同一时间,有一些类型用于引用字符串。从类似地说,它在Rust中最多使用,因为它不涉及资源移动。对于字符串类型的变量:
转换为&strong.due,以严格控制生命周期,Rust中的其他语言中没有字符串插值方法。可以通过以下方法缝制:
破坏的时机如果资源在Rust中移动资源的所有权,那么生命周就可以管理Rust的资源发布时间。,该程序将占据越来越多的内存。当将范围留在Java中时,将清除该变量,但可能不会立即删除所持资源。例如,您需要等到下一个GC,例如::
当然,Java中的一个资源可以由多个参考持有,因此此资源需要等到清除所有参考文献之前。清除所有者,将清除相应的资源:
对于这种生活方式 - 循环管理,一旦涉及引用,它就会变得麻烦,因为我们可能会指向破坏的资源:
幸运的是,Rust帮助我们在编译期间解决了这个问题。当您尝试运行代码时,您会发现:。当您编写代码时,Rust试图分析S和S_REF的声明范围:
可以看出,S的生命周期范围明显小于S_REF。RUST不允许对长期的生命周期进行引用,以指向一个简短的声明周期的资源,因为这将发生类似于下垂指针的问题,即引用了删除资源。当然,这是可能的:
目前,S声明的陈述更长,可以成功编译S_REF的生命周期。另一个值得注意的是,不返回该功能中的参考:
这显然是不兼容的,无法编译。
当通用生命周期涉及与多个资源相关时可能更复杂的参考时。例如,假设我们要实现一个返回更长字符串的函数:
请注意,此代码暂时无法在生锈中编译,提示。从理论上讲,引用陈述的返回比S1和s2中的较短的陈述要短。参数就像,并且不可能知道S1和S1中的较短一个。因此,Rust介绍了Pan -Life Cycle的概念。当我们编写功能时,我们必须使用生命周期标准来标记参数的语句周期,例如:
这意味着该功能具有生命的遗传周期,并且两者都使用'a来标记,表明其声明周期是相同的。引入了S1 S2的生命周期,“这意味着其生命周期的一部分重叠,例如:
由于S的生命周期大于S1和S2的较短部分,因此无法编译。
原始:https://juejin.cn/post/7094909263847358472