Rust所有权,生命周期,借用进阶

2023年 10月 16日 68.7k 0

1. 变量定义

RUST在定义一个变量时,实际上把变量在逻辑上分成了两个部分:

  • 变量内存块
  • 变量内容
  • let mxsm :String = String::from("mxsm");
    

    image.png

    • 变量声明语句定义了一个内存块,上面变量**mxsm**的声明定义一个内存块。
    • 变量类型定义了内存块内容的格式,上面代码String表示了这块内存块的内容格式是String类型
    • 变量初始化赋值则在内存块中写入初始化变量内容。上面就是将 mxsm 初始化内容写入对应的内存块中。

    2. 所有权

    说道所有权官方的给出的解释是:

    • 所有权是一组规则,是一组规则约束,那么这组规则用来干什么呢?就是下面说的第二点
    • 控制程序如何管理内存

    所有权的设计是为了保证对变量进行正确的清理操作。

    2.1. 所有权规则

    所有权有如下三条规则:

    • Rust中的每一个值都有一个拥有者
    • 同一时间值只能有一个拥有者
    • 当拥有者超出范围,值将会被删除

    总结一下就是:所有权指变量内容的独占性。 如何理解这个独占性?我们通过下面的代码进行说明

        fn main() {
            let mxsm: String = String::from("mxsm rust"); //此时mxsm拥有内存块内容"mxsm rust"
            let mxsm2 = mxsm; //此时mxsm1拥有内存块内容"mxsm rust"
            println!("{}", mxsm); //编译报错,mxsm变量失去了拥有内存块的内容"mxsm rust"
        }
    

    内容的独占性也就是所有权规则里面说的:同一时间值只能有一个拥有者

    上面代码中还涉及到了rust的move语义

    2.2 move语义

    所有权转移指的是变量内容在不同的内存块之间的转移(浅拷贝)。当变量内容转移到新的内存块,旧的内存块就失去了这个变量内容的所有权。由此可见,变量名实际仅代表一个内存块,内存块的变量内容与变量名是一个暂时关联关系,RUST定义这种关联关系为绑定。

    备注:实现Copy trait的类型变量不做所有权转移操作,实现Copy trait的类型可通过栈拷贝完成变量内容赋值,清理也可以仅通过通常的调用栈返回完成。 例如基础类型i32, 结构体Duration等等

    2.3 生命周期

    Rust被设计成自动调用变量类型的drop以完成清理,对变量的生命周期跟踪成为一个必然的选择,在判断变量的生命周期终结的时候调用变量的drop函数。

    • Rust采用生命周期仅与变量名相关联的设计

          struct RefTest

    相关文章

    JavaScript2024新功能:Object.groupBy、正则表达式v标志
    PHP trim 函数对多字节字符的使用和限制
    新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
    使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
    为React 19做准备:WordPress 6.6用户指南
    如何删除WordPress中的所有评论

    发布评论