国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

研讀Rust圣經(jīng)解析——Rust learn-11(測試,迭代器,閉包)

這篇具有很好參考價值的文章主要介紹了研讀Rust圣經(jīng)解析——Rust learn-11(測試,迭代器,閉包)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

測試

測試我不打算很詳細的寫,大家知道如何使用其實就差不多了

編寫測試模塊

一般來說我們在lib中編寫測試

cargo new test_01 --lib

這樣我們構(gòu)建了一個test的lib
在這個工程里面你看到應(yīng)該是有個lib.rs沒有main.rs的
研讀Rust圣經(jīng)解析——Rust learn-11(測試,迭代器,閉包)

聲明test模塊

這里并不是聲明一個mod,而是一個測試區(qū)域,在區(qū)域中可以寫很多的測試方法

我們通過#[cfg(test)]宏來進行標注

#[cfg(test)]
mod tests {
  
}

編寫測試方法

測試方法和普通方法沒什么區(qū)別,主要在于標注#[test]

 #[test]
    fn test01() {
        assert_eq!(6, 4);
    }

執(zhí)行測試

我們使用cargo test就可以啟動進行測試了,測試會將所有標注#[test]的方法都測試一遍

測試結(jié)果檢查

我們通常使用assert檢查測試結(jié)果

  1. assert:斷言結(jié)果為true,否則panic
  2. assert_eq:斷言兩邊相等,否則panic
  3. assert_ne:斷言兩邊不等,否則panic

閉包

一個可以儲存在變量里的類似函數(shù)的結(jié)構(gòu)

Rust 的 閉包(closures)是可以保存在一個變量中或作為參數(shù)傳遞給其他函數(shù)的匿名函數(shù)??梢栽谝粋€地方創(chuàng)建閉包,然后在不同的上下文中執(zhí)行閉包運算。不同于函數(shù),閉包允許捕獲被定義時所在作用域中的值。我們將展示閉包的這些功能如何復用代碼和自定義行為。

定義一個閉包

如下,我們使用||{}定義了一個閉包,很像是函數(shù)的寫法:

fn main() {
    let a = || {
        10
    };
    println!("{}",a());
}

這個閉包會返回10,但是實際a的類型是fn:fn->i32,對于但語句來說將{}省略也是OK的

完整寫法

|參數(shù)|->返回值{
	//...
}

閉包可以捕獲環(huán)境

如下的閉包中使用到了b變量,但是b沒有傳入閉包,這就和函數(shù)有了差別,使得我們在做一些簡單的,不用復用的操作的時候可以直接使用閉包而不是定義一個函數(shù)

fn main() {
    let b = 16;
    let a = |x:i32| {
        b * x
    };
    println!("{}",a(10));
}

閉包類比函數(shù)

這里給出圣經(jīng)中的例子:

fn  add_one_v1   (x: u32) -> u32 { x + 1 }
let add_one_v2 = |x: u32| -> u32 { x + 1 };
let add_one_v3 = |x|             { x + 1 };
let add_one_v4 = |x|               x + 1  ;

閉包類型推斷

我們看這個程序,看上去沒任何問題,但是實際上會報錯,原因就是閉包類型推斷,前面我們知道閉包會自動推斷類型,所以當?shù)谝淮螆?zhí)行的時候,閉包認為返回值是String,第二次再次調(diào)用相同的閉包導致了返回值類型不一致,所以報錯:

fn main() {
    let example_closure = |x| x;

    let s = example_closure(String::from("hello"));
    let n = example_closure(5);
}

閉包獲取所有權(quán)

閉包體不嚴格需要所有權(quán),如果希望強制閉包獲取它用到的環(huán)境中值的所有權(quán),可以在參數(shù)列表前使用 move 關(guān)鍵字
在將閉包傳遞到一個新的線程時這個技巧很有用,它可以移動數(shù)據(jù)所有權(quán)給新線程

move ||->返回值類型{
	
}

將被捕獲的值移出閉包和 Fn trait

閉包捕獲和處理環(huán)境中的值的方式影響閉包實現(xiàn)的 trait。Trait 是函數(shù)和結(jié)構(gòu)體指定它們能用的閉包的類型的方式。取決于閉包體如何處理值,閉包自動、漸進地實現(xiàn)一個、兩個或三個 Fn trait。

  1. FnOnce 適用于能被調(diào)用一次的閉包,所有閉包都至少實現(xiàn)了這個 trait,因為所有閉包都能被調(diào)用。一個會將捕獲的值移出閉包體的閉包只實現(xiàn) FnOnce trait,這是因為它只能被調(diào)用一次。
  2. FnMut 適用于不會將捕獲的值移出閉包體的閉包,但它可能會修改被捕獲的值。這類閉包可以被調(diào)用多次。
  3. Fn 適用于既不將被捕獲的值移出閉包體也不修改被捕獲的值的閉包,當然也包括不從環(huán)境中捕獲值的閉包。這類閉包可以被調(diào)用多次而不改變它們的環(huán)境,這在會多次并發(fā)調(diào)用閉包的場景中十分重要。

迭代器

迭代器模式允許你對一個序列的項進行某些處理。迭代器(iterator)負責遍歷序列中的每一項和決定序列何時結(jié)束的邏輯。當使用迭代器時,我們無需重新實現(xiàn)這些邏輯。
迭代器是惰性的:調(diào)用方法使用迭代器前無效

創(chuàng)建一個迭代器

調(diào)用復合類型的iter方法即可創(chuàng)建,但此時無效

fn main() {
    let arr = vec![1,23];
    let item_iter = arr.iter();
}

應(yīng)用迭代器遍歷

以下是使用for對迭代器進行遍歷

fn main() {
    let mut arr = Vec::new();
    arr.push(1);
    arr.push(2);
    let item_iter = arr.iter();
    for item in item_iter {
        println!("{}",item)
    }
}

使用foreach配合閉包遍歷

fn main() {
    let mut arr = Vec::new();
    arr.push(1);
    arr.push(2);
    let item_iter = arr.iter();
    item_iter.for_each(|x|println!("{}",x))
}

通過模擬hasNext進行遍歷

fn main() {
    let mut arr = Vec::new();
    arr.push(1);
    arr.push(2);
    let mut item_iter = arr.iter();
    let mut i = item_iter.len();
    while i != 0 {
        println!("{}", item_iter.next().unwrap());
        i = i - 1;
    }
}

next方法

迭代器的next方法返回的是一個Option<T>這樣一個對象

sum方法

這個方法一樣會消費迭代器,因為獲取迭代器的所有權(quán)并反復調(diào)用 next 來遍歷迭代器

let v1 = vec![1, 2, 3];
let v1_iter = v1.iter();
let total: i32 = v1_iter.sum();

迭代器適配器

Iterator trait 中定義了另一類方法,被稱為 迭代器適配器(iterator adaptors),他們允許我們將當前迭代器變?yōu)椴煌愋偷牡鳌?梢枣準秸{(diào)用多個迭代器適配器。不過因為所有的迭代器都是惰性的,必須調(diào)用一個消費適配器方法以便獲取迭代器適配器調(diào)用的結(jié)果。

fn main() {
    let mut arr = Vec::new();
    arr.push(1);
    arr.push(2);
    let new_arr:Vec<_> = arr.iter().map(|x| x + 4).collect();
    println!("{:?}", new_arr);
}

這里我們使用map對迭代器中的每個元素進行操作,最后使用collect收集為新的集合類型

迭代器的性能

實際上迭代器更快,因為迭代器,作為一個高級的抽象,被編譯成了與手寫的底層代碼大體一致性能代碼。迭代器是 Rust 的 零成本抽象(zero-cost abstractions)之一,它意味著抽象并不會引入運行時開銷
詳細大家可以看這里:
https://kaisery.github.io/trpl-zh-cn/ch13-04-performance.html文章來源地址http://www.zghlxwxcb.cn/news/detail-421614.html

到了這里,關(guān)于研讀Rust圣經(jīng)解析——Rust learn-11(測試,迭代器,閉包)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 【Rust】Rust學習 第十三章Rust 中的函數(shù)式語言功能:迭代器與閉包

    【Rust】Rust學習 第十三章Rust 中的函數(shù)式語言功能:迭代器與閉包

    Rust 的設(shè)計靈感來源于很多現(xiàn)存的語言和技術(shù)。其中一個顯著的影響就是? 函數(shù)式編程 ( functional programming )。函數(shù)式編程風格通常包含將函數(shù)作為參數(shù)值或其他函數(shù)的返回值、將函數(shù)賦值給變量以供之后執(zhí)行等等。 更具體的,我們將要涉及: 閉包 ( Closures ),一個可以儲

    2024年02月12日
    瀏覽(32)
  • Rust編程語言入門之函數(shù)式語言特性:-迭代器和閉包

    閉包(closures) 迭代器(iterators) 優(yōu)化改善 12 章的實例項目 討論閉包和迭代器的運行時性能 閉包:可以捕獲其所在環(huán)境的匿名函數(shù)。 閉包: 是匿名函數(shù) 保存為變量、作為參數(shù) 可在一個地方創(chuàng)建閉包,然后在另一個上下文中調(diào)用閉包來完成運算 可從其定義的作用域捕獲值

    2023年04月08日
    瀏覽(27)
  • 【跟小嘉學 Rust 編程】十三、函數(shù)式語言特性:迭代器和閉包

    【跟小嘉學 Rust 編程】一、Rust 編程基礎(chǔ) 【跟小嘉學 Rust 編程】二、Rust 包管理工具使用 【跟小嘉學 Rust 編程】三、Rust 的基本程序概念 【跟小嘉學 Rust 編程】四、理解 Rust 的所有權(quán)概念 【跟小嘉學 Rust 編程】五、使用結(jié)構(gòu)體關(guān)聯(lián)結(jié)構(gòu)化數(shù)據(jù) 【跟小嘉學 Rust 編程】六、枚舉

    2024年02月11日
    瀏覽(27)
  • 【Rust 基礎(chǔ)篇】Rust 閉包

    在 Rust 中,閉包(closures)是一種函數(shù)對象,它可以捕獲其環(huán)境中的變量,并在需要時調(diào)用。閉包提供了一種方便的方式來封裝行為,并在需要時進行調(diào)用。本篇博客將詳細介紹 Rust 中的閉包,包括閉包的定義、語法、捕獲變量的方式以及一些常見的使用場景。 閉包在 Rust 中

    2024年02月16日
    瀏覽(20)
  • 【python高級用法】迭代器、生成器、裝飾器、閉包

    【python高級用法】迭代器、生成器、裝飾器、閉包

    可迭代對象:可以使用for循環(huán)來遍歷的,可以使用isinstance()來測試。 迭代器:同時實現(xiàn)了__iter__()方法和__next__()方法,可以使用isinstance()方法來測試是否是迭代器對象 使用類實現(xiàn)迭代器 兩個類實現(xiàn)一個迭代器 一個類實現(xiàn)迭代器 可迭代對象與迭代器的總結(jié) 一個具備了__iter_

    2024年02月03日
    瀏覽(24)
  • rust 閉包函數(shù)

    rust 閉包函數(shù)

    函數(shù)有自己的類型,可以像使用基礎(chǔ)類型一樣使用函數(shù),包括將函數(shù)保存在變量中、保存在 vec 中、聲明在結(jié)構(gòu)體成員字段中。閉包函數(shù)也是函數(shù),也有自己的類型定義。不過,函數(shù)實際上是指針類型,在 rust 所有權(quán)中屬于借用的關(guān)系。 我們聲明一個 Vec 對象集,并使用閉包

    2024年02月15日
    瀏覽(21)
  • rust學習-閉包

    模擬健康推薦算法,為前端提供高強度/低強度的訓練app simulated_expensive_calculation 是個算法模塊維護的內(nèi)容,且未來變化較大,所以代碼中期待對其只使用一次。 閉包不要求像 fn 函數(shù)那樣在參數(shù)和返回值上注明類型 函數(shù)需要類型標注是因為是暴露給用戶的顯式接口的一部分

    2024年02月16日
    瀏覽(16)
  • Rust- 閉包

    A closure in Rust is an anonymous function you can save in a variable or pass as an argument to another function. You can create the closure using a lightweight syntax and access variables from the scope in which it’s defined. Here’s an example of a closure that increases a number by one: In this example, plus_one is a closure that takes one argument x a

    2024年02月14日
    瀏覽(24)
  • 【Rust 基礎(chǔ)篇】Rust 迭代器

    在 Rust 中,迭代器(iterators)是一種提供序列化訪問元素的抽象方式。迭代器允許我們對集合中的元素進行遍歷和處理,而無需顯式地處理索引或使用循環(huán)。通過使用迭代器,我們可以編寫簡潔、可讀性強且安全的代碼。本篇博客將詳細介紹 Rust 中的迭代器,包括迭代器的定

    2024年02月16日
    瀏覽(19)
  • 【Rust 基礎(chǔ)篇】Rust 自定義迭代器

    在 Rust 中,自定義迭代器可以幫助我們根據(jù)特定需求實現(xiàn)符合自己邏輯的迭代過程。自定義迭代器是通過實現(xiàn) Iterator trait 來完成的。本篇博客將詳細介紹如何在 Rust 中自定義迭代器,包括自定義迭代器的定義、必要的方法和一些常見的使用場景。 自定義迭代器需要實現(xiàn) Ite

    2024年02月15日
    瀏覽(41)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包