rust解決嵌套-Option類型的map和and_第1頁
rust解決嵌套-Option類型的map和and_第2頁
rust解決嵌套-Option類型的map和and_第3頁
rust解決嵌套-Option類型的map和and_第4頁
rust解決嵌套-Option類型的map和and_第5頁
全文預(yù)覽已結(jié)束

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

第rust解決嵌套——Option類型的map和and目錄map方法的使用and_then方法的使用rust基礎(chǔ)學習歷程先提一個建議如果是通過rust官網(wǎng)入門的話,個人感覺《通過例子學Rust》會比《Rust程序設(shè)計語言》更好一些。

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

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

map方法的使用

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

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

structPeeled(String);

structChoped(String);

structCooked(String);

//削皮

fnpeel(food:OptionString)-OptionPeeled{

matchfood{

Some(food)=Some(Peeled(food)),

None=None,

//切塊

fnchop(peeled_food:OptionPeeled)-OptionChoped{

matchpeeled_food{

Some(Peeled(food))=Some(Choped(food)),

None=None,

//烹飪

fncook(choped_food:OptionChoped)-OptionCooked{

matchchoped_food{

Some(Choped(food))=Some(Cooked(food)),

None=None,

fneat(food:OptionCooked){

matchfood{

Some(Cooked(food))=println!("俺今天吃了{food}"),

None=println!("沒吃"),

}

嘗試完整走完這個流程

letreal_food=Some(String::from("豬頭肉"));

eat(cook(chop(peel(real_food))));

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

fnprocess_food(food:OptionString)-OptionCooked{

food.map(|f|Peeled(f))

.map(|Peeled(f)|Choped(f))

.map(|Choped(f)|Cooked(f))

}

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

可以調(diào)用一下,實際上還是能運行的

letreal_food1=Some(String::from("燒雞"));

eat(process_food(real_food1));

and_then方法的使用

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

enumFood{

Fish,

Chiken,

Cow,

//進行能飛和有腿的檢測,能通過的話就用Some包裹起來

fnhas_legs(food:Food)-OptionFood{

matchfood{

Food::Fish=None,

_=Some(food),

fncan_fly(food:Food)-OptionFood{

matchfood{

Food::Chiken=Some(food),

_=None,

fneat1(food:OptionFood){

matchfood{

Some(_food)=println!("icaneatit"),

None=println!("iamhungury"),

}

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

fntest(food:Food)-OptionFood{

matchhas_legs(food){

None=None,

Some(food)=matchcan_fly(food){

Some(food)=Some(food),

None=None,

}

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

fntest1(food:Food)-OptionFood{

has_legs(food).and_then(can_fly)

}

eat1(test(Food::Chiken));

eat1(test(Food::Fish));

eat1(test1(Food::Cow));

運行起來都是一樣的。

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

rust基礎(chǔ)學習歷程

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

23年初的這次入門終于成功了,原因有二,一是我學了ts和golang+helloworld程度的c++,對類型、棧堆、指針之類的概念有了點基礎(chǔ)的理解

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論