学习新时代编程语言Rust-12小胖的裤子
作者:互联网
上一期我们讲垃圾回收机制和拥有关系(所有权)时留了一个思考题:声明一个变量i并赋值为1000,那它的内存结构是怎么样的呢?跟声明的v有什么区别呢?
我们来看下i的内存结构,当我们声明一个i32类型的变量i时并没有使用堆内存而只使用了栈内存。
这跟声明的String类型的v的内存结构就不一样了。这是因为i的类型是i32在程序编译时可以根据i的类型知道i的长度是32位的,也是长度已知并且是固定不变的,所以就可以把i放在栈上,而变量v的类型是String类型,在编译阶段是不能从v的类型推导出它的长度的也就是长度不可知,所以需要借助堆内存存储v的值”Hello”。从v的内存结构上也可以看出,栈内存就像一本书的目录索引,可以帮助我们快速查找到需要的章节内容,章节内容就相当于存储在堆内存上具体的变量值。
从v跟i的内存结构对比也可以看出,变量i可操作的内存空间只有栈上的,而变量v可操作的内存空间除了栈上存储的索引值还有堆上存储的具体值“Hello”。在编写代码时,什么时候使用栈上的值什么时候使用堆上的值呢?
我们想这么个场景: 话说小胖同学在商城买了条裤子,刚走出商场就接到同事电话需要赶紧回公司,所以小胖就把裤子临时存在了商场的储物柜里并带走了储物柜开箱凭证。到了公司一个新同事听说小胖新买了条最新款的裤子就想看看,小胖想把开箱凭证给新同事让他到商场储物柜去看又担心裤子被弄丢了。所以他并没有直接把开箱凭证给新同事而是把开箱凭证重新复制了分并在上面做了个标记“此凭证只能看”。
我们使用代码实现下这个场景:
首先定义条小胖的裤子并把它放在储物柜里,堆内存就是我们的商场储物柜。
let xiaopang_trousers = String::from(“##########”); //一条很长的裤子。
我们再定义个新同事看裤子的函数
fn new_colleague_look(trousers: String) {
//新同事看了裤子后说:这裤子真帅气
println!(“这裤子:{}真帅气”, trousers);
}
编写好后保存退出使用cargo run 运行下:
程序运行正常,新同事看了裤子说这裤子真帅气。
继续我们的故事,小胖下班后去商场拿它的裤子,在这里输出这是我的裤子。
修改好后保存退出使用cargo run 运行下:
这下出问题了,裤子不是小胖的了,编译器提示裤子已经被新同事拿走了,裤子现在已经不再是小胖的而是新同事的了,在Rust中这种情况称为值的借用,这里的值指的就是裤子本身,也就是小胖给新同事的并不是一个看裤子的凭证而是直接把裤子给了新同事,有同学可能会问既然是借走了那是不是也可以让新同事把裤子还回来,是的,可以返回来,我们修改下代码让新同事看过裤子后把裤子换回来。修改好后保存退出使用cargo run运行看下效果:
出错了,编译器提示我们忘记给新同事看裤子的函数声明返回值了,函数的返回值类型是需要声明的,我们使用”→“(横杠加右尖括号)给新同事看裤子的函数声明返回值类型为String ,修改好后再运行看下效果:
这次又报了个新的错误,编译器告诉我们变量xiaopang_trousers只能赋值一次,因为变量默认是不可变类型的,这就像我们的储物柜的取物凭证是纸质打印的涂改无效,我们需要在声明变量时添加mut关键字创建一个可反复修改的变量,就像我们的电子卡这次可以绑定到1号柜下次可以绑定到2号柜不用每次都换卡。
在变量名前添加mut 后保存退出。重新运行看下效果:
这次运行就正常了,新同事看过裤子后把裤子还回来了,小胖又是这个裤子的主人了。还好是同事愿意把裤子还回来,如果同事不愿意还那小胖就没裤子了,还是小胖只给新同事一个只看裤子的凭证安全一些,新同事也觉得万一裤子丟了就算不是我拿走的也会当成是我拿的了,我还是要个只看裤子的凭证去看看的好,于是新同事就声明自己只要看裤子的凭证。在函数参数类型前添加&号声明只看看。这时就不需要返回值了。
修改好后保存退出运行看下效果:
这里出现个错误,编译器告诉我们新同事看裤子的函数只需要一个裤子的引用也就是看裤子的凭证而我们却给了它一个裤子。也就是新同事说了我只要个看裤子的凭证你就不要再给我裤子了,你相信我不会拿走我还怕万一别人拿走了呢。我们可以在调用函数给函数传递参数时在参数前也加&号,给函数一个引用也就是一个只读的凭证。
修改好后再运行下:
我们可以看到这次代码正常执行了,新同事只是看了看,并没有发生裤子拥有关系的转移,裤子还是小胖的。我们使用&号成功的只是把看裤子的凭证给了新同事而不是直接给新同事裤子,故事里的看裤子的凭证就相当于变量值的引用,那储物柜相当于什么呢?是不是就相当于堆内存啊。我们上面也有提到。
代码运行的时候还有个警告,说这个变量没有变过没有必要声明为可变类型的变量,建议我们把mut关键字去掉,我们先留着,因为我们的故事还没有讲完,下期见!
大家看完后一定要动手去复现下课程中的代码,去亲身感受下。编程是门动手的艺术,不是只背点理论去吹牛皮的。要动手。
免费进群交流
内容根据视频整理,相应视频内容可访问
No matter how low you fell, remember something that has gone right today. Nothing succeeds like success. Even the smallest thing that went well today.
标签:12,凭证,编程语言,储物柜,同事,Rust,小胖,裤子,内存 来源: https://blog.csdn.net/tianlangstudio/article/details/100971219