上一期我們學習使用了引用和可變引用,有個點還需要大家注意下:可變引用是用來标示引用具有修改資料的權限的,但資料能不能修改還要看目前變量是不是可以修改的,這就像小胖找媽媽修改褲子長度,小胖首先要確定褲子本身是可以修改的,再給媽媽配置設定修改褲子的權限才有意義。這也是我們在聲明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類型的字元串是不可變的。
大家可以嘗試下使用字元串字面量做褲子。
内容根據視訊整理,相應視訊内容可通路
51cto學院: