最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Rust 函數(shù)式編程的具體使用

 更新時間:2025年06月27日 10:11:32   作者:pumpkin84514  
本文主要介紹了Rust 函數(shù)式編程的具體使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

Rust 是一門多范式語言,既可以像 C++/Java 那樣寫“命令式代碼”,也支持“函數(shù)式編程”。但很多剛?cè)腴T的小伙伴可能會有這些疑問:

函數(shù)不就是函數(shù)嗎?什么是純函數(shù)?
什么又是副作用?函數(shù)式和我熟悉的 Java/C++ 有啥區(qū)別?
我該怎么開始寫函數(shù)式風格的 Rust 代碼?

別急,今天我們從零出發(fā),把這些看起來很抽象的概念通通講清楚!

一、什么是函數(shù)式編程?一句話概括

函數(shù)式編程(Functional Programming)是:用純粹、可組合的函數(shù)來表達程序邏輯,同時避免副作用。

看不懂?我們來一句一句拆開講 ??

1. 什么是“純粹的函數(shù)”(純函數(shù))?

很多人第一反應是:“函數(shù)不都是函數(shù)嗎?為啥還要強調(diào)‘純’?”

來,舉個例子你就懂了:

舉個例子

fn add(a: i32, b: i32) -> i32 {
    a + b
}

這個函數(shù):

  • 輸入什么,輸出就是什么(比如 2 + 3 永遠等于 5)
  • 不會打印東西、不寫文件、不改全局變量

? 所以它是個“純函數(shù)”。

再舉一個反面例子

fn print_and_add(a: i32, b: i32) -> i32 {
    println!("正在加法運算!");
    a + b
}

這個函數(shù)除了計算結(jié)果,還打印了一句話,這叫做副作用。

2. 什么是“副作用”?

副作用 = 函數(shù)除了返回結(jié)果,還影響了“外部世界”

行為是副作用嗎?原因
改了一個全局變量? 是改變了外部狀態(tài)
打印輸出 println!? 是改變了控制臺
寫入文件? 是改變了磁盤狀態(tài)
發(fā) HTTP 請求? 是影響了外部網(wǎng)絡
單純返回值? 否沒動外部任何東西

為什么函數(shù)式編程追求“無副作用”?

因為副作用:

  • 會讓程序變得難以預測(打印/寫文件在哪影響了誰?)
  • 不利于并發(fā)(多個線程操作全局變量可能會打架)
  • 不好測試(一個函數(shù)打印日志、改配置很難自動驗證)

3. 什么是“組合性”?為啥函數(shù)式編程要“可組合”?

組合性 = 把小函數(shù)像積木一樣拼起來,組成更大的邏輯

比如:

let data = vec![1, 2, 3, 4, 5];

let result: i32 = data
    .iter()              // 遍歷
    .filter(|x| *x % 2 == 0) // 只保留偶數(shù)
    .map(|x| x * 2)      // 每個數(shù)翻倍
    .sum();              // 求和

println!("{}", result);  // 輸出 12(2*2 + 4*2)

這段代碼沒有循環(huán)、沒有中間變量,卻能一步步地處理數(shù)據(jù)。
每個函數(shù)(如 filtermap)都很簡單,但組合起來就完成了復雜的邏輯!

這種“拼積木”的能力,就是組合性。

函數(shù)式編程的三大思想總結(jié):

概念通俗解釋關鍵目的
純函數(shù)不依賴外部,不改外部,只靠輸入決定輸出穩(wěn)定、可預測
無副作用不打印、不改文件、不改全局變量可測試、線程安全
可組合把小函數(shù)組合成大邏輯簡潔、模塊化

函數(shù)式 VS 命令式(C++/Java)

對比點命令式(C++/Java)函數(shù)式(Rust風格)
編程方式寫“怎么做”寫“要什么”
控制結(jié)構(gòu)for、if、變量改來改去map/filter/鏈式處理
狀態(tài)管理變量經(jīng)常變化默認不可變
副作用難避免盡量消除
函數(shù)角色封裝邏輯構(gòu)建模塊
可讀性操作細節(jié)多更像自然語言表達

Rust 支持函數(shù)式編程的方式(顯著特征表)

特征Rust 中的支持方式示例
? 純函數(shù)所有普通函數(shù)默認都可以寫成純函數(shù)fn add(a, b) -> a + b
? 不可變性默認 let 是不可變的let x = 5;
? 閉包(匿名函數(shù))使用 |x| x + 1 定義let f = |x| x + 1;
? 高階函數(shù)函數(shù)可以作為參數(shù)傳入map(|x| x * 2)
? 惰性計算Iterator 是惰性執(zhí)行的.iter().map().filter()
? 函數(shù)組合使用鏈式調(diào)用.map().filter().sum()

?? 解釋閉包:閉包就是一個沒有名字的“臨時函數(shù)”,可以捕獲外部變量,語法是 |參數(shù)| 表達式。

如何從零開始上手 Rust 函數(shù)式編程?

很多人卡在一開始不知道怎么寫函數(shù)式代碼,我們一步步來:

第一步:掌握函數(shù)式寫法格式

寫法示例含義
匿名函數(shù)(閉包)使用 |x| x + 1 定義let f = |x| x + 1;
高階函數(shù)map(|x| x * 2)傳函數(shù)給函數(shù)
鏈式調(diào)用.filter().map()像流水線一樣處理數(shù)據(jù)
collect 收集結(jié)果.collect::<Vec<_>>()把處理結(jié)果收集成 Vec

第二步:從 for 循環(huán)重構(gòu)開始

傳統(tǒng)寫法:

let mut result = vec![];
for i in 1..=5 {
    if i % 2 == 0 {
        result.push(i * 2);
    }
}

函數(shù)式寫法:

let result: Vec<_> = (1..=5)
    .filter(|x| x % 2 == 0)
    .map(|x| x * 2)
    .collect();

第三步:試著傳函數(shù)給函數(shù)(高階函數(shù))

fn operate(x: i32, f: fn(i32) -> i32) -> i32 {
    f(x)
}

fn main() {
    let double = |x| x * 2;
    println!("{}", operate(3, double)); // 輸出 6
}

總結(jié):Rust 函數(shù)式編程,到底有什么價值?

優(yōu)點對初學者的意義
? 代碼更短更清晰不需要手動管理中間變量
? 更容易測試沒副作用就是好測試
? 更少 bug不容易改錯變量
? 更好并發(fā)支持不爭搶變量,天然線程安全

后續(xù)你可以這樣學習函數(shù)式思維:

  • 把所有 for 循環(huán)都試著用 .iter().map().filter() 改寫
  • 學會閉包、理解閉包和變量捕獲
  • 閱讀標準庫 Iterator Trait 的文檔
  • 多寫鏈式組合:map、filter、fold、collect
  • 理解 Option / Result 和函數(shù)式結(jié)合的優(yōu)雅用法

到此這篇關于Rust 函數(shù)式編程的具體使用的文章就介紹到這了,更多相關Rust 函數(shù)式編程內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家! 

相關文章

  • R語言ggplot2繪圖安裝與調(diào)試

    R語言ggplot2繪圖安裝與調(diào)試

    ggplot2是R語言中最常用的繪圖包之一,它提供了一種基于圖層的繪圖語法,使得用戶可以輕松地創(chuàng)建高質(zhì)量的數(shù)據(jù)可視化圖表。在使用ggplot2之前,需要先安裝該包并進行調(diào)試。安裝ggplot2可以通過CRAN或GitHub進行,調(diào)試則需要注意數(shù)據(jù)格式、語法錯誤等問題。
    2023-06-06
  • Rust的泛型、Traits與生命周期用法及說明

    Rust的泛型、Traits與生命周期用法及說明

    本文通過一個尋找列表中最大值的示例,展示了如何從重復代碼中提取函數(shù),再利用泛型實現(xiàn)代碼復用,主要步驟包括:識別重復邏輯;抽象提??;泛型應用;進一步擴展,通過不斷抽象和泛化,我們不僅能減少代碼重復,還能寫出更通用、健壯和可維護的代碼
    2025-02-02
  • Rust 多線程編程的實現(xiàn)

    Rust 多線程編程的實現(xiàn)

    在rust中,多線程編程不算困難,但是也需要留心和別的編程語言中不同的地方,本文主要介紹了Rust 多線程編程的實現(xiàn),感興趣的可以了解一下
    2023-12-12
  • Rust字符串字面值的一些經(jīng)驗總結(jié)

    Rust字符串字面值的一些經(jīng)驗總結(jié)

    字符串有兩種表現(xiàn)形式,一種是基本類型,表示字符串的切片,以&str表示,另一種是可變的string類型,下面這篇文章主要給大家介紹了關于Rust字符串字面值的相關資料,需要的朋友可以參考下
    2022-04-04
  • Rust 錯誤處理高級應用最佳實踐

    Rust 錯誤處理高級應用最佳實踐

    本文介紹了Rust錯誤處理模型,重點講解了Result類型、自定義錯誤、錯誤傳播與轉(zhuǎn)換、錯誤鏈等概念,并以文件操作、網(wǎng)絡請求、數(shù)據(jù)庫操作為例展示了其實戰(zhàn)應用,最后總結(jié)了最佳實踐,通過學習,可以編寫更加健壯、可維護的代碼,感興趣的朋友一起看看吧
    2026-04-04
  • Rust之Substrate框架中的pallet詳解

    Rust之Substrate框架中的pallet詳解

    Pallet是Substrate區(qū)塊鏈的基礎模塊,它定義了區(qū)塊鏈的業(yè)務邏輯和狀態(tài)轉(zhuǎn)換規(guī)則。開發(fā)人員可以使用現(xiàn)有的Pallet來快速構(gòu)建區(qū)塊鏈,也可以開發(fā)自定義的Pallet來實現(xiàn)特定的功能,感興趣的小伙伴可以參考閱讀下
    2023-05-05
  • 關于使用rust調(diào)用c++靜態(tài)庫并編譯nodejs包的問題

    關于使用rust調(diào)用c++靜態(tài)庫并編譯nodejs包的問題

    這篇文章主要介紹了使用rust調(diào)用c++靜態(tài)庫并編譯nodejs包的問題,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-08-08
  • Rust并發(fā)編程之使用消息傳遞進行線程間數(shù)據(jù)共享方式

    Rust并發(fā)編程之使用消息傳遞進行線程間數(shù)據(jù)共享方式

    文章介紹了Rust中的通道(channel)概念,包括通道的基本概念、創(chuàng)建并使用通道、通道與所有權、發(fā)送多個消息以及多發(fā)送端,通道提供了一種線程間安全的通信機制,通過所有權規(guī)則確保數(shù)據(jù)安全,并且支持多生產(chǎn)者單消費者架構(gòu)
    2025-02-02
  • Rust 中解析 JSON的方法

    Rust 中解析 JSON的方法

    要開始在 Rust 中使用 JSON,您需要安裝一個可以輕松操作 JSON 的庫,目前可用的流行crate之一是 serde-json,在本文中,我們將討論如何在 Rust 中使用 JSON 解析庫,以及比較最流行的庫及其性能
    2024-03-03
  • 詳解Rust中三種循環(huán)(loop,while,for)的使用

    詳解Rust中三種循環(huán)(loop,while,for)的使用

    我們常常需要重復執(zhí)行同一段代碼,針對這種場景,Rust?提供了多種循環(huán)(loop)工具。一個循環(huán)會執(zhí)行循環(huán)體中的代碼直到結(jié)尾,并緊接著回到開頭繼續(xù)執(zhí)行。而?Rust?提供了?3?種循環(huán):loop、while?和?for,下面逐一講解
    2022-09-09

最新評論

九台市| 泽州县| 黄山市| 双峰县| 横山县| 枞阳县| 武清区| 郯城县| 荆门市| 和林格尔县| 南召县| 玛纳斯县| 天长市| 威宁| 鸡东县| 正阳县| 凤冈县| 宜章县| 那曲县| 津南区| 仪征市| 和龙市| 崇明县| 射阳县| 秦皇岛市| 胶州市| 锦屏县| 岐山县| 屏边| 香格里拉县| 中卫市| 宜兰市| 河东区| 唐山市| 阳朔县| 吉林市| 威信县| 洛阳市| 绍兴市| 镇远县| 启东市|