Rust for循環(huán)語法糖背后的API場景分析
Rust中for循環(huán)實質(zhì)上是一個語法糖,in后面的對象要求是一個迭代器,for循環(huán)就是對這個迭代器循環(huán)調(diào)用next,而in前面的名稱就是每一次迭代后返回的結(jié)果,如果next返回Option::None則退出循環(huán)。了解這一點后我們可以自己編寫自己的迭代器類型,然后使用for循環(huá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方法中,當方法執(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 {
// 通過*對可變引用進行解引用,從而可以修改引用指向的值
*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() {
// 通過*對可變引用進行解引用,從而可以修改引用指向的值
*item = *item +1;
println!("item:{}", item);
}
println!("collection after for loop:{:?}", collection);
}參考資料:
1.《Rust實戰(zhàn)》(Rust In Action)
到此這篇關(guān)于Rust for循環(huán)語法糖背后的API的文章就介紹到這了,更多相關(guān)Rust for循環(huán)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Rust使用libloader調(diào)用動態(tài)鏈接庫
這篇文章主要為大家介紹了Rust使用libloader調(diào)用動態(tài)鏈接庫示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-09-09
libbpf和Rust開發(fā)ebpf程序?qū)崙?zhàn)示例
這篇文章主要為大家介紹了libbpf和Rust開發(fā)ebpf程序?qū)崙?zhàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-12-12
MacBook Pro安裝rust編程環(huán)境的過程
rustup是一個用于管理Rust版本和工具鏈的工具,這篇文章主要介紹了MacBook Pro安裝rust編程環(huán)境的過程,感興趣的朋友跟隨小編一起看看吧2024-02-02
在Rust中要用Struct和Enum組織數(shù)據(jù)的原因解析
在Rust中,Struct和Enum是組織數(shù)據(jù)的核心工具,Struct用于將相關(guān)字段封裝為單一實體,便于管理和擴展,Enum用于明確定義所有可能的狀態(tài),本文將通過具體示例,深入探討為什么在Rust中必須使用struct和enum來管理數(shù)據(jù),感興趣的朋友一起學習吧2025-02-02
Rust?編程語言中的所有權(quán)ownership詳解
這篇文章主要介紹了Rust?編程語言中的所有權(quán)ownership詳解的相關(guān)資料,需要的朋友可以參考下2023-02-02

