網站首頁 編程語言 正文
先提一個建議如果是通過rust官網入門的話,個人感覺《通過例子學 Rust》會比《Rust 程序設計語言》更好一些。
我這里的例子實際上也是官網上的例子,對于看一遍不太清晰的例子,我會選擇自己寫下來。
這篇文章假設你已經了解了關于Option類型的一些概念(實際上是rust用來處理空值的工具)。
map方法的使用
需求:假設我想吃一種食物,這個食物需要經過削皮、切塊和煮熟這三個線性的流程,此外在這三個流程之前,我還要判斷這個原材料是否存在,只有以上條件全部滿足,才能達成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));
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"),
}
}
將上面的兩個檢測函數組合成一個
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的特點是:你會比以往更了解自己寫的代碼。
希望能有更多人學習這門語言,我也會盡可能以一個業余者的身份更新一些rust或者其他編程的基礎知識。
原文鏈接:https://blog.csdn.net/huangfengnt/article/details/128860689
相關推薦
- 2023-01-17 Python無權點文件轉化成鄰接矩陣方式_python
- 2022-04-07 C#實現Socket服務器及多客戶端連接的方式_C#教程
- 2022-04-12 python?獲取list?長度_python
- 2022-07-03 python使用pandas讀xlsx文件的實現_python
- 2021-12-13 在Centos7中配置NIS的詳細過程_Linux
- 2022-08-03 Android開發手冊Chip監聽及ChipGroup監聽_Android
- 2022-06-29 利用python實現你說我猜游戲的完整實例_python
- 2022-11-23 Python中列表的基本操作匯總_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支