最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Rust可迭代類型迭代器正確創(chuàng)建自定義可迭代類型的方法

 更新時間:2023年12月08日 09:40:14   作者:SlimeNull  
在 Rust 中, 如果一個類型實(shí)現(xiàn)了 Iterator, 那么它會被同時實(shí)現(xiàn) IntoIterator, 具體邏輯是返回自身, 因?yàn)樽陨砭褪堑?這篇文章主要介紹了Rust可迭代類型迭代器正確創(chuàng)建自定義可迭代類型的方法,需要的朋友可以參考下

在 Rust 中, for 語句的執(zhí)行依賴于類型對于 IntoIterator 的實(shí)現(xiàn), 如果某類型實(shí)現(xiàn)了這個 trait, 那么它就可以直接使用 for 進(jìn)行循環(huán).

直接實(shí)現(xiàn)

在 Rust 中, 如果一個類型實(shí)現(xiàn)了 Iterator, 那么它會被同時實(shí)現(xiàn) IntoIterator, 具體邏輯是返回自身, 因?yàn)樽陨砭褪堑?

但是如果自身就是迭代器的話, 就意味著自身必須存儲迭代狀態(tài), 例如當(dāng)前迭代的位置. 如果是這樣的話, 迭代器就只能被使用一次. 況且自身直接被傳入 into_iter 方法后, 所有權(quán)被轉(zhuǎn)移, 該對象就無法被再次使用了.

定義類型本身:

struct IntRange {
    current: i32,
    step: i32,
    end: i32
}

直接為其實(shí)現(xiàn)迭代器:

impl Iterator for IntRange {
    type Item = i32;
    fn next(&mut self) -> Option<Self::Item> {
        if self.current == self.end {
            return None;
        } else {
            let current = self.current;
            self.current += self.step;
            return Some(current);
        }
    }
}

使用該類型:

let range = IntRange { current: 0, step: 1, end: 10 };
for value in range {
    println!("v: {}", value);
}

所以結(jié)論是, 如果你的類型是一次性用品, 你可以直接對其實(shí)現(xiàn) Iterator

手動實(shí)現(xiàn)迭代器

如果你向手動實(shí)現(xiàn)類似于容器的東西, 那么它當(dāng)然不是一次性的. 我們應(yīng)該仿照 Rust 中對切片的迭代器實(shí)現(xiàn).

同時實(shí)現(xiàn)會轉(zhuǎn)移所有權(quán)和不會轉(zhuǎn)移所有權(quán)的兩個迭代器對 self&self 都實(shí)現(xiàn) IntoIterator, 這樣就可以做不轉(zhuǎn)移所有權(quán)的迭代了

類型本身:

struct IntRange {
    step: i32,
    end: i32
}

兩個迭代器:

struct IntRangeIter<'a> {
    range: &'a IntRange,
    current: i32,
}
struct IntRangeIntoIter {
    range: IntRange,
    current: i32,
}

兩個迭代器實(shí)現(xiàn):

impl Iterator for IntRangeIter<'_> {
    type Item = i32;
    fn next(&mut self) -> Option<Self::Item> {
        if self.current == self.range.end {
            return None;
        } else {
            let current = self.current;
            self.current += self.range.step;
            return Some(current);
        }
    }
}
impl Iterator for IntRangeIntoIter {
    type Item = i32;
    fn next(&mut self) -> Option<Self::Item> {
        if self.current == self.range.end {
            return None;
        } else {
            let current = self.current;
            self.current += self.range.step;
            return Some(current);
        }
    }
}

實(shí)現(xiàn)返回兩種迭代器的 IntoIterator:

impl<'a> IntoIterator for &'a IntRange {
    type Item = i32;
    type IntoIter = IntRangeIter<'a>;
    fn into_iter(self) -> Self::IntoIter {
        IntRangeIter {
            range: self,
            current: 0
        }
    }
}
impl IntoIterator for IntRange {
    type Item = i32;
    type IntoIter = IntRangeIntoIter;
    fn into_iter(self) -> Self::IntoIter {
        IntRangeIntoIter {
            range: self,
            current: 0
        }
    }
}

使用它:

let range = IntRange { step: 1, end: 10 };
// 可以使用引用來進(jìn)行 for 循環(huán)
for value in &range {
    println!("v: {}", value);
}
// 也可以直接對其進(jìn)行 for 循環(huán)
for value in range {
    println!("v: {}", value);
}

切片對迭代的實(shí)現(xiàn)

我們知道, Rust 的切片有一個 iter 方法, 其實(shí)它就相當(dāng)于對當(dāng)前切片的引用調(diào)用 into_iter.

其實(shí), 在調(diào)用切片引用的 into_iter 方法時, 本質(zhì)上就是調(diào)用的其 iter 方法. 方法的實(shí)現(xiàn)是在 iter 內(nèi)的.

let v = vec![1, 2, 3];
// 下面兩個調(diào)用是等價的
let iter1 = v.iter();
let iter2 = (&v).into_iter();

如果你希望實(shí)現(xiàn)迭代變量可變的迭代器, 還可以為 &mut T 實(shí)現(xiàn) into_iter, 當(dāng)然, Rust 內(nèi)部對于切片的實(shí)現(xiàn), 也是這樣的:

let mut v = vec![1, 2, 3];
// 下面兩個調(diào)用是等價的
let mutIter = v.iter_mut();
let mutIter = (&mut v).into_iter();

總結(jié)

兩種類型:

  • 對于一次性使用的類型, 可以直接對其實(shí)現(xiàn)迭代器 trait.
  • 對于容器, 不應(yīng)該對容器本身直接實(shí)現(xiàn)迭代器, 而是應(yīng)該單獨(dú)創(chuàng)建迭代器類型, 然后對其本身實(shí)現(xiàn) IntoIterator

為了方便用戶使用, 調(diào)用之間的實(shí)現(xiàn)應(yīng)該是這樣:

  • 實(shí)現(xiàn) TIntoIterator
  • 實(shí)現(xiàn) &Titer 函數(shù), 返回借用的迭代器.
  • 實(shí)訓(xùn) &mut Titer_mut 函數(shù), 返回可變借用的迭代器.
  • &T&mut T 實(shí)現(xiàn) into_iter 函數(shù), 并在內(nèi)部調(diào)用剛剛實(shí)現(xiàn)的 iteriter_mut 函數(shù).

這樣, 用戶就可以直接調(diào)用 iter 方法獲得借用的迭代器, 然后使用 map, filter 等方法進(jìn)行集合的復(fù)雜操作了

到此這篇關(guān)于Rust可迭代類型迭代器正確創(chuàng)建自定義可迭代類型的方法的文章就介紹到這了,更多相關(guān)Rust迭代器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Rust常用功能實(shí)例代碼匯總

    Rust常用功能實(shí)例代碼匯總

    通過一系列實(shí)用示例展示了Rust在文件操作、網(wǎng)絡(luò)請求、并發(fā)編程、命令行工具以及數(shù)據(jù)庫操作等方面的應(yīng)用,這些示例不僅展示了 Rust 的強(qiáng)大功能,還提供了實(shí)際開發(fā)中的指導(dǎo)和參考,通過這些示例,您可以更好地理解 Rust 的特性,并將其應(yīng)用于您的項(xiàng)目中
    2024-12-12
  • Rust的基礎(chǔ)數(shù)據(jù)類型、變量系統(tǒng)、類型轉(zhuǎn)換以及實(shí)戰(zhàn)應(yīng)用

    Rust的基礎(chǔ)數(shù)據(jù)類型、變量系統(tǒng)、類型轉(zhuǎn)換以及實(shí)戰(zhàn)應(yīng)用

    本文介紹了Rust的基礎(chǔ)數(shù)據(jù)類型、變量系統(tǒng)、類型轉(zhuǎn)換以及實(shí)戰(zhàn)應(yīng)用,涵蓋了標(biāo)量類型、復(fù)合類型和字符串類型,通過變量聲明、可變性控制、作用域規(guī)則以及Shadowing機(jī)制的學(xué)習(xí),掌握Rust的變量系統(tǒng),通過實(shí)際案例,展示了Rust在實(shí)際編程中的應(yīng)用
    2026-01-01
  • rust流程控制的具體使用

    rust流程控制的具體使用

    在Rust中,控制流包括條件語句、循環(huán)和匹配模式等,用于實(shí)現(xiàn)程序的邏輯和流程控制,本文就來詳細(xì)的介紹一下,感興趣的可以了解一下
    2023-12-12
  • 詳解thiserror庫在Rust中的使用

    詳解thiserror庫在Rust中的使用

    在編程中,錯誤處理是一個至關(guān)重要的部分,在Rust中,我們經(jīng)常使用Result和Option類型來進(jìn)行錯誤處理,但有時,我們需要創(chuàng)建自定義的錯誤類型,這就是thiserror庫發(fā)揮作用的地方,可以極大的簡化代碼,所以本文就給大家介紹一下如何使用thiserror
    2023-08-08
  • Rust模塊關(guān)鍵詞和哈希表詳解

    Rust模塊關(guān)鍵詞和哈希表詳解

    文章介紹了Rust編程語言中模塊系統(tǒng)、路徑控制、as關(guān)鍵字、外部包的使用以及哈希表的操作,主要涵蓋了如何通過pub關(guān)鍵字控制模塊和結(jié)構(gòu)體的可見性,文章還詳細(xì)講解了哈希表的創(chuàng)建、訪問、所有權(quán)轉(zhuǎn)移、更新操作,感興趣的朋友一起看看吧
    2026-03-03
  • Rust內(nèi)存示例深入講解

    Rust內(nèi)存示例深入講解

    內(nèi)存管理一直是編程中的一大挑戰(zhàn),尤其是在C和C++中,程序員需要手動處理內(nèi)存分配和釋放,這篇文章主要介紹了Rust內(nèi)存的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2026-02-02
  • 一文帶你了解Rust是如何處理錯誤的

    一文帶你了解Rust是如何處理錯誤的

    程序在運(yùn)行的過程中,總是會不可避免地產(chǎn)生錯誤,而如何優(yōu)雅地解決錯誤,也是語言的設(shè)計哲學(xué)之一。本文就來和大家來了Rust是如何處理錯誤的,感興趣的可以了解一下
    2022-11-11
  • Rust 入門之函數(shù)和注釋實(shí)例詳解

    Rust 入門之函數(shù)和注釋實(shí)例詳解

    這篇文章主要為大家介紹了Rust 入門之函數(shù)和注釋實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • Rust常用特型之Drop特型

    Rust常用特型之Drop特型

    本文主要介紹了Rust常用特型之Drop特型,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-03-03
  • Rust 堆內(nèi)存指針 Box的實(shí)現(xiàn)示例

    Rust 堆內(nèi)存指針 Box的實(shí)現(xiàn)示例

    在 Rust 中,Box<T>是最基礎(chǔ)、最簡潔的智能指針,核心作用是將數(shù)據(jù)從棧內(nèi)存轉(zhuǎn)移到堆內(nèi)存,并通過獨(dú)占所有權(quán)機(jī)制管理堆內(nèi)存的分配與釋放,下面就來詳細(xì)的介紹一下,感興趣的可以了解一下
    2026-04-04

最新評論

兴山县| 图木舒克市| 德令哈市| 启东市| 盖州市| 连平县| 平远县| 临漳县| 策勒县| 涟水县| 青州市| 田东县| 阿城市| 灵宝市| 顺义区| 太湖县| 江北区| 闸北区| 呈贡县| 呈贡县| 峨眉山市| 台州市| 新绛县| 白山市| 昌吉市| 临汾市| 青河县| 沂水县| 招远市| 鲁山县| 五常市| 香格里拉县| 长子县| 收藏| 饶平县| 东平县| 额济纳旗| 榆林市| 扬州市| 迭部县| 高陵县|