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

释放双眼,带上耳机,听听看~!

上一期我们说到小胖使用引用在不发生裤子拥有关系变更的情况下让新同事看了裤子,接下来小胖发现裤子太长了,现在裤子长度是10个单位,他穿9个单位长度的裤子。小胖就找女朋友帮他改下裤子,女朋友说这会儿去找工作了需要等晚上回去才能改。小胖又去找妈妈。妈妈把裤长移除了一个单位长度。现在裤子的长度是9了。
我们使用代码实现下故事场景,先输出现在裤子的长度,再定义一个女朋友和妈妈修改裤子的函数。小胖只是找女朋友和妈妈帮忙修改裤子,而不是要把裤子给她们,所以还是传递一个引用类型的参数给她们。而不是直接给她们裤子因为那样会发生裤子所有权的更改。女朋友输出“这会儿去找工作了需要晚上回去改”,妈妈使用pop方法把裤子的长度移除一个单位长度,也就是把字符串trousers_xiaopang的最后一个”#“号弹出。在main方法中调用女朋友和妈妈修改裤子的函数。小胖现在再查看下裤子的长度,在这里输出裤子的长度。
学习新时代编程语言Rust-13裤子太长了
修改好后保存退出,使用cargo run 运行看下效果。如果不出意外我们会收到一个错误。
学习新时代编程语言Rust-13裤子太长了
错误出现了,错误信息告诉我们:trousers是一个引用不能做为可变引用类型。这里的帮助信息提示我们可以使用&mut把trousers声明为可变的引用类型。这就相当于告诉我们,小胖你需要让妈妈帮你修改裤子,但是你并没有给妈妈修改裤子的权限。怎么给妈妈分配可以修改裤子的权限呢?可以通过在参数名前加&mut,然后给妈妈传递一个可变类型的引用。
学习新时代编程语言Rust-13裤子太长了
我们加上mut关键字,修改好后再运行看下效果。这次在屏幕里输出了我们的故事情节,现在裤子长度是9了,长度刚好。
学习新时代编程语言Rust-13裤子太长了这里还有个需要注意的点,如果xiaopang_trousers变量在声明时没有使用mut变量标示它是可变的,虽然我们声明了可变的引用也不能修改裤子。这就像小胖要找妈妈修改裤子,首先他要保证这个裤子是可修改的,这样他给妈妈分配修改裤子的权限才有意义。
然后女朋友晚上回来看到裤子想起需要帮小胖把裤子改短一个单位,所以女朋友也使用pop方法把裤子改短一个单位长度。这下裤子是不是太短了,我们重新运行看下效果。这次裤子的长度改成了8,太短了吧,在编写代码时我们也经常遇到这种重复修改、修改冲突的问题,这也是为什么Rust语言在设计时把变量和引用默认都设计成不可变的,在语言层次上减少限制使用可变类型以避免修改冲突的问题。
学习新时代编程语言Rust-13裤子太长了
这也是Rust把安全做为一个设计目标的一个体现。也是在提醒我们编写代码时要特别注意可变类型的变量。那现在我们该怎么办呢? 我们可以考虑使用幂等的方法解决这个问题。什么是幂等的方法呢,简单说就是无论你调用这个方法多少次获取的结果都是一样的。比如我们现在可以把这里的pop方法换成幂等的truncate方法,也就是把每次减少一个单位长度换成把裤子截取为长度为9。修改好后我们再运行看下效果。这次虽然妈妈和女朋友都有修改,裤子的长度依然是期望的9。
学习新时代编程语言Rust-13裤子太长了
我们总结下学到的概念。引用:当传递变量时我们可以选择直接传递变量值也可以选择只传递变量的引用,传递引用时不会发生所以权的变更,就像小胖给新同事看裤子一样。不要直接给新同事裤子而只是给他看裤子的凭证。
可变引用:当我们需要调用函数修改变量值时我们需要使用&mut给函数声明并传递一个可变类型的引用,这样函数内部才有修改变量值的权限。就像小胖找妈妈修改裤子一样,需要给妈妈分配修改裤子的权限。
另外需要注意:可变类型的引用同时只能有一个并且跟不可变类型的引用不能同时存在
不可变类型的引用可以同时存在多个,这个也比较好理解,如果大家都是来看看裤子的同时来看也不会把裤子看短了是吧?但是一旦出现有的要修改裤子那就有可能把裤子改短了。
这里有同学可能会问,我们代码里不是同时出现了俩个可变的裤子引用吗?调用女朋友修改函数时一个调用妈妈修改函数时又一个。
没错这里的确是俩个,但编译器可以区分出他们不是同时存在的。调用女朋友修改函数时传递的可变引用在女朋友修改函数执行完就销毁了,所以在调用妈妈修改函数时编译器认为当前只存在一个可变引用。接下来我们修改下代码,让俩个可变引用的生命周期发生交集。也就是同时存在,在看下效果。修改好后保存退出使用cargo run 运行:接下来我们就可以看到编译器提示我们同时只能有一个可变类型的引用了。
对于拥有关系、借用、引用、可变引用概念不是很清楚的同学请通过平台给我们留言,我们会及时答复。

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

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

51cto学院:
学习新时代编程语言Rust-13裤子太长了

免费进群交流

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

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

给TA打赏
共{{data.count}}人
人已打赏
安全技术

c++ vector

2022-1-11 12:36:11

安全经验

Websecurify 0.9 发布,Web应用安全测试

2011-10-8 11:12:22

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索