上一期我们学习使用了引用和可变引用,有个点还需要大家注意下:可变引用是用来标示引用具有修改数据的权限的,但数据能不能修改还要看当前变量是不是可以修改的,这就像小胖找妈妈修改裤子长度,小胖首先要确保裤子本身是可以修改的,再给妈妈分配修改裤子的权限才有意义。这也是我们在声明xiaopang_trousers时为什么要使用mut的原因。有同学复现课程中代码时忘记敲这里的mut关键字了,一直运行不成功,所以我们在这里说下,如果你在复现课程代码时遇到什么问题也欢迎给我们联系我们会及时答复。
接下来继续我们的故事,话说上次小胖是买了一条裤子,这次小胖买了一箱裤子。新同事想看,小胖只想让他看其中的几条,并不想把所有的裤子都给他看。胖子买裤子啊一般都会长,这次也不例外,但这次裤子比较多所以小胖找女朋友和妈妈分别改一部分裤子。用代码该怎么实现呢?!
我们先删除掉不需要的代码,再定义一个数组,数组里面放着小胖子的裤子,用这个数组表示小胖的一箱裤子。裤子比较多,我们加个编号区分。如果我们直接传递一个xiaopang_box_trousers的引用是不是新同事就看到所有的裤子了?那怎么办呢?
我们可以在xiaopang_box_trousers引用后使用中括号只获取数组一部分元素。也就是只给新同事看一部分裤子的凭证。这里我们使用1…3给新同事看第2条和第3条裤子。这里的1代表选取数组元素的起始索引,我们知道数组的索引是从0开始的,所以0代表数组中的第一个元素,这里的1也就代表数组中的第2个元素也就是第2条裤子。这里的3代表选取数组元素的结束索引,跟启始索引不一样的是,选取结果中并不包含结束索引。这里的1和3就组成了一个从1到3的前开后闭区间,也就是选取了从第一条到第3条裤子,但是不包括第3条裤子。另外这里的起始索引和结束索引都可以不指定。如果不指定起始索引代表从第一个元素开始取,如果不指定结束索引代表从启始索引开始的所有元素。
这样只取数组一部分元素引用的操作,称为切片。这个名字比较形象是吧,一个蛋糕吃不完,可以切一部分。
接下来我们修改下新同事看裤子的函数,原来是接受一个String类型的引用,现在一次要看多条裤子,索引要改成一个String类型的切片。
这里使用for循环遍历切片里的元素,也就是把切片里的裤子一个一个的看完。
修改好后,保存退出使用cargo run 运行下代码。
从控制台输出的信息可以看出,新同事只看到了第2条和第3条裤子,跟我们的故事情节相吻合。接下来我们实现下小胖找女朋友和妈妈修改裤子长度的代码。
我们修改下女朋友修改裤子的函数,跟新同事看裤子的函数类似需要将参数类型换成String类型的可变切片。在女朋友修改裤子的函数中遍历裤子切片时需要iter mut方法生成一个可变类型的迭代器,这样我们遍历出的裤子才是一个可变类型的引用。
我们再修改下妈妈修改裤子的函数。
修改调用函数时传递的参数,女朋友修改从第1条裤子到第3条裤子,起始值省略即代表从第一条开始,当然你也可以写个0在这里。妈妈修改剩下的裤子,这里结束索引值也可以省略。
修改好后保存,运行看下效果。
我们可以在控制台看到女朋友修改了第1条第2条和第3条裤子,妈妈修改了剩下的第4条和第5条裤子。
这一期我们学习了切片slice,用于只获取数组,集合元素的一部分元素引用。切片跟普通的引用一样也可以声明为可修改的。
另外需要向大家介绍一个特殊的切片类型 &str. 我们可以把String类型看成是由字符类型组合而成的集合类型。
因此我们也可以使用切片语法获取String的一部分元素。&str类型就可以看做String的不可变切片。当我们使用字符串字面量也就是直接在代码中写入一串文字给一个变量赋值时,这个变量的类型也是&str类型,在&号后没有mut关键字所以这样声明的字符串是不可变的。这也是为什么我们这里要使用String::from方法创建字符串而不是直接使用字面量。因为我们的裤子需要修改长度需要变动,而使用字符串字面量创建的&str类型的字符串是不可变的。
大家可以尝试下使用字符串字面量做裤子。
学习新时代编程语言Rust-14一箱裤子
最新推荐文章于 2024-04-16 11:38:21 发布