rust學習筆記21-閉包

????????在 Rust 中,閉包(Closures) 是一種可以捕獲其環境中的變量的匿名函數。它們非常靈活,既可以作為普通函數使用,也可以捕獲和操作定義它們的作用域中的變量。閉包是 Rust 中處理短小邏輯代碼塊的強大工具,特別是在需要將邏輯作為參數傳遞給其他函數時。

1. 基本語法

閉包的語法簡潔,用?|參數| { 代碼塊 }?表示:

// 無參數的閉包
let greet = || println!("Hello, Rust!");
greet();// 帶參數的閉包
let add = |a: i32, b: i32| -> i32 { a + b };
println!("Sum: {}", add(3, 5));// 類型可省略(編譯器自動推斷)
let multiply = |x, y| x * y; 
println!("Product: {}", multiply(4, 5));

?2. 捕獲環境變量
閉包可以捕獲其定義時的作用域變量,捕獲方式分為三種(對應三個 trait):
????????不可變借用(Fn):只讀取環境變量。
????????可變借用(FnMut):可修改環境變量。
????????所有權轉移(FnOnce):消費環境變量(只能調用一次)。

fn main() {// 不可變借用let name = "rust";let print_name = || println!("Name: {}", name); // 捕獲 name 的不可變引用print_name(); // 可多次調用// 可變借用let mut count = 0;let mut increment = || { count += 1; // 捕獲可變引用println!("Count: {}", count);};increment(); // 可多次調用,但閉包本身需聲明為 mut// 所有權移動let x = vec![1, 2, 3];let closure = move || println!("x: {:?}", x); // 獲取所有權closure();//println!("{:?}", x); // 錯誤: x 已被移動到閉包中}

3.?閉包作為函數參數

閉包經常被用作函數參數,特別是對于高階函數(Higher-order Functions),例如 map, filter, fold 等。

示例:使用閉包過濾偶數

fn main() {let numbers = vec![1, 2, 3, 4, 5, 6];let even_numbers: Vec<i32> = numbers.into_iter().filter(|&x| x % 2 == 0).collect();println!("Even numbers: {:?}", even_numbers); // 輸出: Even numbers: [2, 4, 6]
}

4. 閉包與 Trait
Rortex 內部使用了三個 Trait 來表示閉包的行為:
Fn: 表示閉包可以通過引用調用。
FnMut: 表示閉包可以通過可變引用調用。
FnOnce: 表示閉包只能調用一次,通常是因為它需要獲取環境變量的所有權。

// 接受 Fn 閉包(不可變借用)
fn run_closure<F: Fn()>(f: F) {f();
}// 接受 FnMut 閉包(可變借用)
fn run_mut_closure<F: FnMut()>(mut f: F) {f();
}// 接受 FnOnce 閉包(所有權轉移)
fn run_once_closure<F: FnOnce()>(f: F) {f();
}

5. 性能特點
零成本抽象:閉包通常被編譯為普通函數,無運行時開銷。
內聯優化:編譯器可能將閉包內聯,提升性能。
內存分配:默認在棧上分配,使用 Box 時才會堆分配。

6.線程中傳遞閉包

fn main() {use std::thread;let value = 42;let handle = thread::spawn(move || { // 強制轉移所有權到線程println!("Value in thread: {}", value);});handle.join().unwrap();
}

總結

Rust 閉包通過以下機制實現強大功能:
????????靈活捕獲環境:支持不可變/可變借用和所有權轉移。
????????零成本抽象:編譯時生成高效代碼。
????????類型安全:通過 Fn、FnMut、FnOnce trait 保證行為正確性。
通過合理利用閉包,你可以寫出更加直觀、高效的代碼,尤其是在處理數據轉換、異步編程等場景下。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/75124.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/75124.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/75124.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

linux實現rsync+sersync實時數據備份

1.概述 rsync(Remote Sync) 是一個Unix/linux系統下的文件同步和傳輸工具 2.端口和運行模式 tcp/873 采用C/S模式&#xff08;客戶端/服務器模式&#xff09; 3.特點 可以鏡像保存整個目錄和文件第一次全量備份(備份全部的文件),之后是增量備份(只備份變化的文件) 4. 數…

【第30節】MFC編程:ListCtrl控件和TreeCtrl控件

目錄 引言 一、高級控件ListCtrl 二、高級控件TreeCtrl 三、Shell控件 四、CImageList 五、綜合代碼示例 引言 在MFC編程里&#xff0c;高級控件能大幅提升應用程序的交互性與功能性。接下來&#xff0c;咱們會詳細講講ListCtrl和TreeCtrl這兩個高級控件。不僅會介紹它們…

為什么 ThreadLocalMap 的 key 是弱引用 value是強引用

問題一&#xff1a;為什么 ThreadLocalMap 的 key 是弱引用&#xff1f; 【假設 Entry 的 key 是對 ThreadLocal 對象的強引用】&#xff1a;這個 Entry 又持有 ThreadLocal 對象和 value 對象的強引用。如果在其他地方都沒有對這個 ThreadLocla 對象的引用了、然后在使用 Thr…

DeepSeek本地部署(linux)

一、下載并安裝Ollama 1.下載Ollama Ollama官網:Ollama 點擊"Download",會跳轉至下載頁面。 1.1在線下載安裝 可復制此命令到Linux服務器進行在線下載,如下載速度過慢,可選擇離線下載安裝。 curl -fsSL https://ollama.com/install.sh | sh1.2離線下載安裝 …

基于Halcon仿VM流程列表的執行效果

Halcon本身應用需要一定的門檻&#xff0c;但是也可以封裝成類似VM簡單易操作的樣子 上期文章分享的是連線功能&#xff0c;本期分享數據傳參 1&#xff0c;定義通用屬性和方法 public class BaseModel {public HObject HInput { get; set; }//圖像輸入public HObject HOutpu…

打車APP訂單系統邏輯梳理與實現

一、邏輯分析 打車 APP 訂單系統是整個打車業務的核心&#xff0c;負責處理從乘客下單到行程結束的一系列流程&#xff0c;涉及乘客、司機和平臺三方的交互。 乘客端 下單&#xff1a;乘客打開 APP&#xff0c;輸入上車地點、目的地&#xff0c;選擇車型等信息后提交訂單。此時…

雜草YOLO系列數據集4000張

一份開源數據集——雜草YOLO數據集&#xff0c;該數據集適用于農業智能化、植物識別等計算機視覺應用場景。 數據集詳情 ?訓練集&#xff1a;3,664張高清標注圖像?測試集&#xff1a;180張多樣性場景樣本?驗證集&#xff1a;359張嚴格篩選數據 下載鏈接 雜草YOLO數據集分…

算法 | 河馬優化算法原理,公式,應用,算法改進及研究綜述,matlab代碼

以下是關于河馬優化算法(Hippopotamus Optimization Algorithm, HO)的完整綜述,包含原理、公式、應用場景、改進方向及可直接運行的 Matlab 完整代碼。一、算法原理 河馬優化算法(HO)由Amiri等人于2024年提出,是受河馬群體行為啟發的元啟發式算法,其核心基于以下三階段行…

知識就是力量——HELLO GAME WORD!

你好&#xff01;游戲世界&#xff01; 簡介環境配置前期準備好文章介紹創建頭像小功能組件安裝本地中文字庫HSV顏色空間音頻生成空白的音頻 游戲UI開發加載動畫注冊登錄界面UI界面第一版第二版 第一個游戲&#xff08;貪吃蛇&#xff09;第二個游戲&#xff08;俄羅斯方塊&…

Android Activity 的 launchMode 與 Task Stack 管理

Android 中的 android:launchMode 決定了 Activity 在啟動時如何在任務欄中管理它的存在方式。下面我們來結合 Task Stack 管理詳細解釋。 1. android:launchMode 的四種模式 1.1 standard (標準模式, 默認) 啟動方式&#xff1a;每次啟動都會創建一個新實例并壓入欄任務堆中…

2025選擇手機之我見

自從開店之后&#xff0c;沒當有手機召開發布會&#xff0c;我就得去大概看看&#xff0c;了解一下屏幕&#xff0c;充電之類的東西。畢竟跟我的生意息息相關&#xff0c;而且還得研究要不要上新&#xff0c;從我目前賣貨的情況來看&#xff0c;折疊屏不是大眾的選擇&#xff0…

【區塊鏈安全 | 第九篇】基于Heimdall設計的智能合約反編譯項目

文章目錄 背景目的安裝1、安裝 Rust2、克隆 heimdall-dec3、編譯 heimdall-dec4、運行 heimdall-dec 使用說明1、訪問 Web 界面2、輸入合約信息3、查看反編譯結果 實戰演示1、解析普通合約2、解析代理合約 背景 在區塊鏈安全研究中&#xff0c;智能合約的審計和分析至關重要。…

利用 PCI-Express 交換機實現面向未來的推理服務器

在數據中心系統的歷史上&#xff0c;沒有比被 Nvidia 選為其 AI 系統的組件供應商更高的贊譽了。 這就是為什么新興的互連芯片制造商 Astera Labs 感到十分高興&#xff0c;因為該公司正在 PCI-Express 交換機、PCI-Express 重定時器和 CXL 內存控制器方面與 Broadcom 和 Marv…

智能交通預警桿:守護道路安全的科技先鋒

在城市化進程加速以及機動車保有量持續增長的背景下&#xff0c;道路交通安全與擁堵問題漸趨嚴峻。智能交通預警桿應時而生&#xff0c;其集成多種高科技功能&#xff0c;正逐步成為現代城市交通管理中至關重要的智能裝備&#xff0c;對于提升交通效率、保障出行安全發揮著關鍵…

flink 基站與服務器長連接,每次連接和斷開都會上報數據,統計過去一小時每個基站斷開次數和時長

模擬生成數據 CREATE TABLE ods_station_log (base_station_id int, -- 基站IDevent_type int, -- 事件類型: connect/disconnectevent_time TIMESTAMP_LTZ(3), -- 事件時間WATERMARK FOR event_time AS event_time - INTERVAL 5 SECOND -- 允許5秒亂序 ) WITH …

自定義一些C語言的字符串函數

一、代碼如下 (一)十六進制字符串轉十進制整數 #include<stdio.h> // 把一個十六進制字符轉成十進制整數 int hexToInt(char hexs[]){ int index; int k 0; for(k 0; ; k) { if(hexs[k] \0) { index k; break; …

核函數(機器學習深度學習)

一、核函數的基本概念 核函數&#xff08;Kernel Function&#xff09; 是機器學習中處理非線性問題的核心工具&#xff0c;通過隱式映射將數據從原始空間轉換到高維特征空間&#xff0c;從而在高維空間中實現線性可分或線性建模。其數學本質是計算兩個樣本在高維空間中的內積…

微服務架構中的精妙設計:服務注冊/服務發現-Eureka

一.使用注冊中心背景 1.1服務遠程調用問題 服務之間遠程調?時, 我們的URL是寫死的 String url "http://127.0.0.1:9090/product/" orderInfo.getProductId(); 缺點&#xff1a; 當更換機器, 或者新增機器時, 這個URL就需要跟著變更, 就需要去通知所有的相關服…

極速版:棧的內存/局部變量表/堆的內存細分

1. 棧的存儲 每個線程都有自己的棧&#xff0c;棧中數據以棧幀&#xff08;Stack Frame&#xff09;為基本單位 線程上正在執行的每個方法都各自對應一個棧楨&#xff08;Stack Frame&#xff09; 棧楨是一個內存區塊&#xff0c;是一個數據集&#xff0c;維系著方法執行過程…

【操作系統】內存泄漏 vs 內存碎片

【操作系統】內存泄漏 vs 內存碎片 內存泄漏&#xff08;Memory Leak&#xff09; vs 內存碎片&#xff08;Memory Fragmentation&#xff09;1. 內存泄漏&#xff08;Memory Leak&#xff09;2. 內存碎片&#xff08;Memory Fragmentation&#xff09;3. 內存泄漏 vs 內存碎片…