網(wǎng)站首頁 編程語言 正文
Rust中for循環(huán)實質(zhì)上是一個語法糖,in后面的對象要求是一個迭代器,for循環(huán)就是對這個迭代器循環(huán)調(diào)用next,而in前面的名稱就是每一次迭代后返回的結(jié)果,如果next返回Option::None則退出循環(huán)。了解這一點后我們可以自己編寫自己的迭代器類型,然后使用for循環(huán)進(jìn)行迭代。
rust有三種for循環(huán),分別用于不同的場景。
1.拿走所有權(quán)的for循環(huán)
形式如:for item in collection
(集合或容器類型)會拿走collection的所有權(quán)(ownership)
。
fn main() { let collection: Vec<i32> = vec![1, 2, 4, 6, 9]; // 注意這兒的item類型是i32 for item in collection { println!("item:{}", item); } // for循環(huán)之后,不能再使用collection,因為collection的所有權(quán)已經(jīng)被拿走,且在for循環(huán)后collection已經(jīng)被drop掉了 // println!("collection:{:?}", collection); }
因為rust編譯器會將for item in collection
替換成for item in IntoIterator::into_iter(collection)
:
fn main() { let collection: Vec<i32> = vec![1, 2, 4, 6, 9]; // rust中的into_開頭的方法一般情況下都會拿走參數(shù)的所有權(quán) let iter = IntoIterator::into_iter(collection); // 從這兒開始,collection已經(jīng)不能再被使用,因為collection的所有權(quán)被轉(zhuǎn)移到into_iter方法中,當(dāng)方法執(zhí)行完,collection就被drop掉了 // println!("collection:{:?}", collection); // 如果這兒使用collection就會編譯報錯 for item in iter{ println!("item:{}", item); } }
正如Rust官網(wǎng)https://doc.rust-lang.org/std/iter/trait.IntoIterator.html上說的:One benefit of implementing IntoIterator
is that your type will work with Rust’s for
loop syntax.,即實現(xiàn)IntoIterator trait能夠讓你自定義類型在for循環(huán)中使用。
Vec正是實現(xiàn)了IntoIterator,所以才可以在for循環(huán)中使用的:
2.只讀for循環(huán)
形式如:for item in &collection
,不會拿走collection的所有權(quán),只會獲取它的不可變引用:
fn main() { let collection: Vec<i32> = vec![1, 2, 4, 6, 9]; // 注意這兒item的類型是&i32,即它是對collection中元素的不可變引用 for item in &collection { println!("item:{}", item); } println!("collection after for loop:{:?}", collection); }
因為rust會將for item in &collection
替換成for item in collection.iter()
:
fn main() { let collection: Vec<i32> = vec![1, 2, 4, 6, 9]; // 注意這兒item的類型是&i32,即它是對collection中元素的不可變引用 for item in collection.iter() { // 等價于for item in (&collection).iter() { println!("item:{}", item); } println!("collection after for loop:{:?}", collection); }
迭代完集合中的元素后,集合還可以繼續(xù)使用。
3.讀寫for循環(huán)
形式如:for item in &mut collection
,不會拿走collection的所有權(quán),只會獲取它的可變引用:
fn main() { // 注意,為了修改collection中的元素,collection本身必須聲明為mut let mut collection: Vec<i32> = vec![1, 2, 4, 6, 9]; // 注意這兒item的類型是&mut i32,即它是對collection中元素的可變引用 for item in &mut collection { // 通過*對可變引用進(jìn)行解引用,從而可以修改引用指向的值 *item = *item +1; println!("item:{}", item); } println!("collection after for loop:{:?}", collection); }
上面的程序運行輸出:
item:2
item:3
item:5
item:7
item:10
collection after for loop:[2, 3, 5, 7, 10]
實現(xiàn)了對集合元素的修改。
因為rust會將for item in &mut collection
替換成for item in collection.iter_mut()
:
fn main() { // 注意,為了修改collection中的元素,collection本身必須聲明為mut let mut collection: Vec<i32> = vec![1, 2, 4, 6, 9]; // 注意這兒item的類型是&mut i32,即它是對collection中元素的可變引用 for item in collection.iter_mut() { // 等價于for item in (&mut collection).iter_mut() { // 通過*對可變引用進(jìn)行解引用,從而可以修改引用指向的值 *item = *item +1; println!("item:{}", item); } println!("collection after for loop:{:?}", collection); }
參考資料:
1.《Rust實戰(zhàn)》(Rust In Action)
原文鏈接:https://blog.csdn.net/lzufeng/article/details/127707366
相關(guān)推薦
- 2023-07-05 React 簡單實現(xiàn) v-if和v-show的元素控制效果
- 2022-12-09 React文件分段上傳實現(xiàn)方法詳解_React
- 2022-11-08 PostgreSQL?pg_filenode.map文件介紹_PostgreSQL
- 2022-12-02 AVFoundation?AVCaptureSession媒體捕捉_IOS
- 2022-06-15 Win10下通過Ubuntu安裝Redis的過程_Redis
- 2022-10-11 C++函數(shù)模板與類模板相同與不同介紹_C 語言
- 2022-04-02 Python面向?qū)ο蟮某绦蛟O(shè)計詳情_python
- 2022-12-06 Python實現(xiàn)批量修改xml文件的腳本_python
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支