上一期我们说到小胖使用引用在不发生裤子拥有关系变更的情况下让新同事看了裤子,接下来小胖发现裤子太长了,现在裤子长度是10个单位,他穿9个单位长度的裤子。小胖就找女朋友帮他改下裤子,女朋友说这会儿去找工作了需要等晚上回去才能改。小胖又去找妈妈。妈妈把裤长移除了一个单位长度。现在裤子的长度是9了。
  我们使用代码实现下故事场景,先输出现在裤子的长度,再定义一个女朋友和妈妈修改裤子的函数。小胖只是找女朋友和妈妈帮忙修改裤子,而不是要把裤子给她们,所以还是传递一个引用类型的参数给她们。而不是直接给她们裤子因为那样会发生裤子所有权的更改。女朋友输出“这会儿去找工作了需要晚上回去改”,妈妈使用pop方法把裤子的长度移除一个单位长度,也就是把字符串trousers_xiaopang的最后一个”#“号弹出。在main方法中调用女朋友和妈妈修改裤子的函数。小胖现在再查看下裤子的长度,在这里输出裤子的长度。

修改好后保存退出,使用cargo run 运行看下效果。如果不出意外我们会收到一个错误。

错误出现了,错误信息告诉我们:trousers是一个引用不能做为可变引用类型。这里的帮助信息提示我们可以使用&mut把trousers声明为可变的引用类型。这就相当于告诉我们,小胖你需要让妈妈帮你修改裤子,但是你并没有给妈妈修改裤子的权限。怎么给妈妈分配可以修改裤子的权限呢?可以通过在参数名前加&mut,然后给妈妈传递一个可变类型的引用。

我们加上mut关键字,修改好后再运行看下效果。这次在屏幕里输出了我们的故事情节,现在裤子长度是9了,长度刚好。
这里还有个需要注意的点,如果xiaopang_trousers变量在声明时没有使用mut变量标示它是可变的,虽然我们声明了可变的引用也不能修改裤子。这就像小胖要找妈妈修改裤子,首先他要保证这个裤子是可修改的,这样他给妈妈分配修改裤子的权限才有意义。
然后女朋友晚上回来看到裤子想起需要帮小胖把裤子改短一个单位,所以女朋友也使用pop方法把裤子改短一个单位长度。这下裤子是不是太短了,我们重新运行看下效果。这次裤子的长度改成了8,太短了吧,在编写代码时我们也经常遇到这种重复修改、修改冲突的问题,这也是为什么Rust语言在设计时把变量和引用默认都设计成不可变的,在语言层次上减少限制使用可变类型以避免修改冲突的问题。

这也是Rust把安全做为一个设计目标的一个体现。也是在提醒我们编写代码时要特别注意可变类型的变量。那现在我们该怎么办呢? 我们可以考虑使用幂等的方法解决这个问题。什么是幂等的方法呢,简单说就是无论你调用这个方法多少次获取的结果都是一样的。比如我们现在可以把这里的pop方法换成幂等的truncate方法,也就是把每次减少一个单位长度换成把裤子截取为长度为9。修改好后我们再运行看下效果。这次虽然妈妈和女朋友都有修改,裤子的长度依然是期望的9。

  我们总结下学到的概念。引用:当传递变量时我们可以选择直接传递变量值也可以选择只传递变量的引用,传递引用时不会发生所以权的变更,就像小胖给新同事看裤子一样。不要直接给新同事裤子而只是给他看裤子的凭证。
可变引用:当我们需要调用函数修改变量值时我们需要使用&mut给函数声明并传递一个可变类型的引用,这样函数内部才有修改变量值的权限。就像小胖找妈妈修改裤子一样,需要给妈妈分配修改裤子的权限。
另外需要注意:可变类型的引用同时只能有一个并且跟不可变类型的引用不能同时存在
不可变类型的引用可以同时存在多个,这个也比较好理解,如果大家都是来看看裤子的同时来看也不会把裤子看短了是吧?但是一旦出现有的要修改裤子那就有可能把裤子改短了。
这里有同学可能会问,我们代码里不是同时出现了俩个可变的裤子引用吗?调用女朋友修改函数时一个调用妈妈修改函数时又一个。
  没错这里的确是俩个,但编译器可以区分出他们不是同时存在的。调用女朋友修改函数时传递的可变引用在女朋友修改函数执行完就销毁了,所以在调用妈妈修改函数时编译器认为当前只存在一个可变引用。接下来我们修改下代码,让俩个可变引用的生命周期发生交集。也就是同时存在,在看下效果。修改好后保存退出使用cargo run 运行:接下来我们就可以看到编译器提示我们同时只能有一个可变类型的引用了。
  对于拥有关系、借用、引用、可变引用概念不是很清楚的同学请通过平台给我们留言,我们会及时答复。

另外大家一定要自己把课程中的代码敲一下运行一下亲身感受一下。编程是需要动手的艺术。

内容根据视频整理,相应视频内容可访问

51cto学院:

免费进群交流

If you want to continue to succeed, share success with those who have helped you.

学习新时代编程语言Rust-13裤子太长了相关推荐

  1. 学习新时代编程语言Rust-12小胖的裤子

    上一期我们讲垃圾回收机制和拥有关系(所有权)时留了一个思考题:声明一个变量i并赋值为1000,那它的内存结构是怎么样的呢?跟声明的v有什么区别呢? 我们来看下i的内存结构,当我们声明一个i32类型的变 ...

  2. 学习新时代编程语言Rust-14一箱裤子

    上一期我们学习使用了引用和可变引用,有个点还需要大家注意下:可变引用是用来标示引用具有修改数据的权限的,但数据能不能修改还要看当前变量是不是可以修改的,这就像小胖找妈妈修改裤子长度,小胖首先要确保裤子 ...

  3. 学习Python心得体会:不要担心代码太长。长代码,相当于中文的作文。长不代表理解不了。长代码也是由几个短句子组成的。不要怕

    学习Python心得体会: 不要担心代码太长.长代码,相当于中文的作文.长不代表理解不了.长代码也是由几个短句子组成的.不要怕

  4. 2019年你应该学习哪种编程语言?

    ▲点击上方"什么技术值得学",关注持续获得知识 无论您是专业开发人员还是初学者,对学习新的编程语言总是一个好主意. 当然,并不是每个专业或有抱负的开发人员都必须绝对学习的单一语言. ...

  5. 如何快速学习一门新的编程语言?

    本文假定你至少已掌握了一门编程语言,然后,可以帮助你更好学习编程. 作者 | Bob Roebling 译者 | 弯月,责编 | 郭芮 出品 | CSDN(ID:CSDNnews) 以下为译文: 上学 ...

  6. 如何学习一门新的编程语言

    本文于 2018 年发布于思否社区 作者 SegmentFault CTO 祁宁 首先要说,这并不是一篇教你如何学习的文章,因为到今天为止我也没有找到一种通用的方法来解决如何学习的问题.但是在探索的道 ...

  7. 知识图谱与深度学习(新时代·技术新未来)

    作者:刘知远,韩旭,孙茂松 出版社:清华大学出版社 品牌:清华大学出版社 出版时间:2020-05-01 知识图谱与深度学习(新时代·技术新未来)

  8. 【NLP】FedNLP: 首个联邦学习赋能NLP的开源框架,NLP迈向分布式新时代

    文 | 阿毅 两周前,南加大Yuchen Lin(PhD student @USC and ex-research intern @GoogleAI)所在的团队在Twitter官宣开源首个以研究为导向 ...

  9. FedNLP: 首个联邦学习赋能NLP的开源框架,NLP迈向分布式新时代

    文 | 阿毅 两周前,南加大Yuchen Lin(PhD student @USC and ex-research intern @GoogleAI)所在的团队在Twitter官宣开源首个以研究为导向 ...

最新文章

  1. C++ 第五课:C/C++ 数据类型
  2. SES机箱管理知识回顾(二) 之SAF-TE简介
  3. python就业方向及工资-【行情分享】python就业方向与薪资大揭秘
  4. 李宏毅线性代数笔记13:SVD分解
  5. 最全整理!Python 操作 Excel 库 xlrd与xlwt 常用操作详解!
  6. java 生成静态html的一段代码
  7. php debug 打印变量_PHP_Debug显示所有变量
  8. 2000坐标系转经纬度工具_【Leaflet开发】L.CRS + 搞定Leaflet多坐标系拓展
  9. python数据结构4-栈和队列
  10. Java静态代理类的特点和示例
  11. java maven web项目_java maven项目跟web项目区别
  12. GB50174《电子信息系统机房设计规范》贯标培训通知
  13. 掘金15W沸点简单分析(一)
  14. Android前景与未来趋势
  15. Mysql 分数排名查询
  16. Lomo 照片特效 Lr 预设 Lomo Lightroom Presets
  17. hosts文件导致无法网页观看视频
  18. 磁盘配额和raid配置
  19. 【毕业设计】基于单片机的墨水屏阅读器(单词卡) - 物联网 嵌入式
  20. 【简单】反转双向链表-Java

热门文章

  1. LOL与Dota雪崩效果
  2. 5. iOS打包上传后不显示
  3. vant Tab标签
  4. 无论你做什么爸爸妈妈都爱你java_各位叔叔阿姨啊,我不管做什么都会被自己的爸爸妈妈教育啊,如果你是? 爱问知识人...
  5. Paradox of our times
  6. 网络工程师待遇、就业前景和职业规划
  7. 我对《无为无不为》的感想
  8. 华为nova6计算机,华为nova 6 SE四摄美拍:好硬件+强算法=美照片
  9. dell计算机的硬盘如何分区,有关Dell Inspiron 11计算机的硬盘分区的详细教程
  10. C++解决ACM直播状态输出控制