欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

rust解決嵌套——Option類型的map和and_then方法的使用

 更新時間:2023年02月04日 09:42:07   作者:自己瞎琢磨  
這篇文章主要介紹了rust解決嵌套——Option類型的map和and_then方法,本文結合實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下

先提一個建議如果是通過rust官網(wǎng)入門的話,個人感覺《通過例子學 Rust》會比《Rust 程序設計語言》更好一些。

我這里的例子實際上也是官網(wǎng)上的例子,對于看一遍不太清晰的例子,我會選擇自己寫下來。

這篇文章假設你已經(jīng)了解了關于Option類型的一些概念(實際上是rust用來處理空值的工具)。

map方法的使用

需求:假設我想吃一種食物,這個食物需要經(jīng)過削皮、切塊和煮熟這三個線性的流程,此外在這三個流程之前,我還要判斷這個原材料是否存在,只有以上條件全部滿足,才能達成eat的目標。

我們可以這樣去設計:食物本身是一個Option選項,此外每經(jīng)過上面的一個流程,就可以將食物包裹在一個對應的元組結構體之中。于是我們有了下面的寫法:

struct Peeled(String);
struct Choped(String);
struct Cooked(String);
// 削皮
fn peel(food: Option<String>) -> Option<Peeled> {
    match food {
        Some(food) => Some(Peeled(food)),
        None => None,
    }
}
// 切塊
fn chop(peeled_food: Option<Peeled>) -> Option<Choped> {
    match peeled_food {
        Some(Peeled(food)) => Some(Choped(food)),
        None => None,
    }
}
// 烹飪
fn cook(choped_food: Option<Choped>) -> Option<Cooked> {
    match choped_food {
        Some(Choped(food)) => Some(Cooked(food)),
        None => None,
    }
}
// 吃
fn eat(food: Option<Cooked>) {
    match food {
        Some(Cooked(food)) => println!("俺今天吃了{food}"),
        None => println!("沒吃"),
    }
}

嘗試完整走完這個流程

let real_food = Some(String::from("豬頭肉"));
eat(cook(chop(peel(real_food))));

明顯可以看到這里有一個函數(shù)的嵌套,不是非常雅觀,那么我們可以使用Option類型的map方法對三個處理過程進行改寫,改成一個函數(shù)叫process_food

fn process_food(food: Option<String>) -> Option<Cooked> {
    food.map(|f| Peeled(f))
        .map(|Peeled(f)| Choped(f))
        .map(|Choped(f)| Cooked(f))
}

這個map當中是一個閉包,以第一個閉包為例,它只處理Some的情況,它會將Some(food:String)轉換成Some(Peeled(food)),否則直接返回None,當然這里還涉及到一個解構的問題,上面的f實際上全部是函數(shù)的參數(shù)food包裹的那個String(講的很抽象)。

可以調用一下,實際上還是能運行的

  let real_food1 = Some(String::from("燒雞"));
  eat(process_food(real_food1));

and_then方法的使用

需求,有一些食物,我只吃能飛和有腿的,如果符合要求就以Some(food)的形式返回

enum Food {
    Fish,
    Chiken,
    Cow,
}
// 進行能飛和有腿的檢測,能通過的話就用Some包裹起來
fn has_legs(food: Food) -> Option<Food> {
    match food {
        Food::Fish => None,
        _ => Some(food),
    }
}
fn can_fly(food: Food) -> Option<Food> {
    match food {
        Food::Chiken => Some(food),
        _ => None,
    }
}
fn eat1(food: Option<Food>) {
    match food {
        Some(_food) => println!("i can eat it"),
        None => println!("i am hungury"),
    }
}

將上面的兩個檢測函數(shù)組合成一個

fn test(food: Food) -> Option<Food> {
    match has_legs(food) {
        None => None,
        Some(food) => match can_fly(food) {
            Some(food) => Some(food),
            None => None,
        },
    }
}

這里的test又變成了一個match的嵌套,這里的檢測在流程上沒有順序要求,當然你可以通過改寫match的流程來固定順序,可以用and_then來進行改寫

fn test1(food: Food) -> Option<Food> {
    has_legs(food).and_then(can_fly)
}
 eat1(test(Food::Chiken));
 eat1(test(Food::Fish));
 eat1(test1(Food::Cow));

運行起來都是一樣的。

這兩個方法的用法情境有什么不同呢?恕我才疏學淺,暫時不能用準確的言語進行概括

rust基礎學習歷程

目前的水平只能說是入門,之前分別在21和22年入門過兩次,均是失敗告終,一方面rust確實火星,另一方面我自學編程當時只有js基礎。

23年初的這次入門終于成功了,原因有二,一是我學了ts和golang+hello world程度的c++,對類型、棧堆、指針之類的概念有了點基礎的理解。二是我明白了rust那些火星般的新特點是針對編程中的老問題提出的,從實用角度去理解能更好掌握這些新的特點。

我認為rust的特點是:你會比以往更了解自己寫的代碼。

希望能有更多人學習這門語言,我也會盡可能以一個業(yè)余者的身份更新一些rust或者其他編程的基礎知識。

到此這篇關于rust解決嵌套——Option類型的map和and_then方法的文章就介紹到這了,更多相關rust Option類型的map和and_then方法內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 詳解rust?自動化測試、迭代器與閉包、智能指針、無畏并發(fā)

    詳解rust?自動化測試、迭代器與閉包、智能指針、無畏并發(fā)

    這篇文章主要介紹了rust?自動化測試、迭代器與閉包、智能指針、無畏并發(fā),本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-11-11
  • 深入了解Rust的切片使用

    深入了解Rust的切片使用

    除了引用,Rust?還有另外一種不持有所有權的數(shù)據(jù)類型:切片(slice),切片允許我們引用集合中某一段連續(xù)的元素序列,而不是整個集合。本文讓我們來深入了解Rust的切片
    2022-11-11
  • 深入理解Rust中Cargo的使用

    深入理解Rust中Cargo的使用

    本文主要介紹了深入理解Rust中Cargo的使用,Cargo簡化了項目的構建過程,提供了依賴項管理,以及一系列方便的工作流程工具,下面就來具體的介紹一下如何使用,感興趣的可以了解一下
    2024-04-04
  • Rust?duckdb和polars讀csv文件比較情況

    Rust?duckdb和polars讀csv文件比較情況

    duckdb在數(shù)據(jù)分析上,有非常多不錯的特質,1、快;2、客戶體驗好,特別是可以同時批量讀csv在一個目錄下的csv等文件,今天來比較下Rust?duckdb和polars讀csv文件比較的情況,感興趣的朋友一起看看吧
    2024-06-06
  • Rust?use關鍵字妙用及模塊內容拆分方法

    Rust?use關鍵字妙用及模塊內容拆分方法

    這篇文章主要介紹了Rust?use關鍵字妙用|模塊內容拆分,文中還給大家介紹use關鍵字的習慣用法,快速引用自定義模塊內容或標準庫,以此優(yōu)化代碼書寫,需要的朋友可以參考下
    2022-09-09
  • Rust語言之trait中的個方法可以重寫嗎

    Rust語言之trait中的個方法可以重寫嗎

    在Rust中,trait定義了一組方法,這些方法可以被一個或多個類型實現(xiàn),當你為某個類型實現(xiàn)一個trait時,你可以為該trait中的每個方法提供自己的具體實現(xiàn),本文將給大家介紹一下trait中的個方法是否可以重寫,需要的朋友可以參考下
    2023-10-10
  • Rust中的不安全代碼詳解

    Rust中的不安全代碼詳解

    這篇文章主要為大家介紹了Rust中的不安全代碼詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-04-04
  • 從迷你todo?命令行入門Rust示例詳解

    從迷你todo?命令行入門Rust示例詳解

    這篇文章主要為大家介紹了從一個迷你todo命令行入門Rust的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-01-01
  • 一文弄懂rust生命周期

    一文弄懂rust生命周期

    生命周期是Rust語言中的一個概念,用于決內存安全問題,本文主要介紹了一文弄懂rust生命周期,具有一定的參考價值,感興趣的可以了解一下
    2023-12-12
  • 深入了解Rust中函數(shù)與閉包的使用

    深入了解Rust中函數(shù)與閉包的使用

    本文主要介紹一下Rust函數(shù)相關的內容,首先函數(shù)我們其實一直都在用,所以函數(shù)本身沒什么可說的,我們的重點是與函數(shù)相關的閉包、高階函數(shù)、發(fā)散函數(shù),感興趣的可以學習一下
    2022-11-11

最新評論