<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
先提一個建議如果是通過rust官網入門的話,個人感覺《通過例子學 Rust》會比《Rust 程式設計語言》更好一些。
我這裡的例子實際上也是官網上的例子,對於看一遍不太清晰的例子,我會選擇自己寫下來。
這篇文章假設你已經瞭解了關於Option型別的一些概念(實際上是rust用來處理空值的工具)。
需求:假設我想吃一種食物,這個食物需要經過削皮、切塊和煮熟這三個線性的流程,此外在這三個流程之前,我還要判斷這個原材料是否存在,只有以上條件全部滿足,才能達成eat的目標。
我們可以這樣去設計:食物本身是一個Option選項,此外每經過上面的一個流程,就可以將食物包裹在一個對應的元組結構體之中。於是我們有了下面的寫法:
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))));
明顯可以看到這裡有一個函數的巢狀,不是非常雅觀,那麼我們可以使用Option型別的map方法對三個處理過程進行改寫,改成一個函數叫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實際上全部是函數的引數food包裹的那個String(講的很抽象)。
可以呼叫一下,實際上還是能執行的
let real_food1 = Some(String::from("燒雞")); eat(process_food(real_food1));
需求,有一些食物,我只吃能飛和有腿的,如果符合要求就以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"), } }
將上面的兩個檢測函陣列合成一個
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));
執行起來都是一樣的。
這兩個方法的用法情境有什麼不同呢?恕我才疏學淺,暫時不能用準確的言語進行概括
目前的水平只能說是入門,之前分別在21和22年入門過兩次,均是失敗告終,一方面rust確實火星,另一方面我自學程式設計當時只有js基礎。
23年初的這次入門終於成功了,原因有二,一是我學了ts和golang+hello world程度的c++,對型別、棧堆、指標之類的概念有了點基礎的理解。二是我明白了rust那些火星般的新特點是針對程式設計中的老問題提出的,從實用角度去理解能更好掌握這些新的特點。
我認為rust的特點是:你會比以往更瞭解自己寫的程式碼。
希望能有更多人學習這門語言,我也會盡可能以一個業餘者的身份更新一些rust或者其他程式設計的基礎知識。
到此這篇關於rust解決巢狀——Option型別的map和and_then方法的文章就介紹到這了,更多相關rust Option型別的map和and_then方法內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45