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

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

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

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

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

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

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

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

看不懂?我們來(lái)一句一句拆開(kāi)講 ??

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

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

來(lái),舉個(gè)例子你就懂了:

舉個(gè)例子

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

這個(gè)函數(shù):

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

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

再舉一個(gè)反面例子

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

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

2. 什么是“副作用”?

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

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

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

因?yàn)楦弊饔茫?/p>

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

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

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

比如:

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

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

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

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

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

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

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

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

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

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

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

?? 解釋閉包:閉包就是一個(gè)沒(méi)有名字的“臨時(shí)函數(shù)”,可以捕獲外部變量,語(yǔ)法是 |參數(shù)| 表達(dá)式

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

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

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

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

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

傳統(tǒng)寫(xiě)法:

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

函數(shù)式寫(xiě)法:

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ù)式編程,到底有什么價(jià)值?

優(yōu)點(diǎn)對(duì)初學(xué)者的意義
? 代碼更短更清晰不需要手動(dòng)管理中間變量
? 更容易測(cè)試沒(méi)副作用就是好測(cè)試
? 更少 bug不容易改錯(cuò)變量
? 更好并發(fā)支持不爭(zhēng)搶變量,天然線程安全

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

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

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

相關(guān)文章

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

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

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

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

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

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

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

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

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

    Rust 錯(cuò)誤處理高級(jí)應(yīng)用最佳實(shí)踐

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

    Rust之Substrate框架中的pallet詳解

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

    關(guān)于使用rust調(diào)用c++靜態(tài)庫(kù)并編譯nodejs包的問(wèn)題

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

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

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

    Rust 中解析 JSON的方法

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

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

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

最新評(píng)論

白水县| 甘洛县| 东莞市| 岳池县| 津南区| 秭归县| 碌曲县| 大埔区| 梅河口市| 黎城县| 梨树县| 兴安盟| 长乐市| 乐都县| 门源| 偃师市| 长泰县| 大足县| 溆浦县| 望城县| 五指山市| 永福县| 绥中县| 道真| 博兴县| 蓬安县| 故城县| 融水| 乐东| 中卫市| 阳谷县| 枝江市| 滦平县| 马山县| 文化| 札达县| 定陶县| 蓝山县| 长武县| 南岸区| 富宁县|