rust學習 閉包 closuer

2021-09-03 03:34:54 字數 1252 閱讀 8467

閉包就是匿名函式或者lambda表示式,由於rust的一些特殊語法,rust中的閉包與其他語言有些不一樣的用法,每次看過很容易忘記,特此記錄。

閉包的基本定義方法是:

使用 || 替代 () 將輸入變數括起來。

區塊定界符{}將所有函式中的表示式擴起來,如果只有一條表示式也可以不加。

閉包與函式的一大區別是,閉包能夠在內部使用上層定義的外部變數。

基本例子:

let closure_annotated = |i: i32| -> i32 ;

let i = 3;

println!("closure_annotated: {}", closure_annotated(i));

//輸出 closure_annotated:4

引用捕獲:

let color = "green";

//此處的閉包會捕獲了 '&t'

let print = || println!("`color`: {}", color);

// 使用借用來呼叫閉包。

print();

print();

可變引用捕獲(捕獲並改變變數):

let mut count = 0;

//此處的閉包會捕獲了 '&mut t'

//因為counti在閉包中被改變了, 所以必須使用mut來修飾, 否則編譯器報錯

let mut inc = || ", count);

};inc();

inc();

值捕獲並釋放變數:

//movable是不可複製型別

let movable = box::new(3);

//此處的閉包會捕獲 't'

let consume = || ", movable);

mem::drop(movable);

};//該閉包只能呼叫一次, 否則編譯器報錯

consume();

閉包的型別

按照對於捕獲變數的不同處理閉包可以分為三種型別: fn, fnmut, fnonce

分別對應了的捕獲方式是引用捕獲』&t』, 可變引用捕獲』&mut t』, 值捕獲』t』。

其使用的受限程度依次遞減,意思是說fnonce可以通過三種方式捕獲變數,編譯器會根據閉包內的變數處理方式判斷應該使用哪種捕獲方式。

// to do

Rust閉包小結

rust會根據閉包體進行環境變數的捕獲,閉包捕獲環境中變數的模式優先順序順序為 不可變借用,可變借用,所有權。fn main println s 這個閉包的閉包體和上面僅有一處不同,那就是加了move,這會強行拿走s的所有權,即影響了捕獲方式。即使 閉包體看起來是用最普通的不可變引用來操作的環境中的...

rust筆記13 閉包

閉包是乙個可捕獲周圍環境的可執行 片段,基本的幾個定義方式如下 fn add one v1 x u32 u32 let add one v2 x u32 u32 let add one v3 x let add one v4 x x 1 內部的是捕獲的周圍的變數,預設捕獲的是不可變借用,先給出乙個實...

Rust基礎筆記 閉包

closure看上去是這樣的 let plus one x i32 x 1 assert eq 2,plus one 1 首先建立乙個繫結plus one,然後將它分配給乙個closure,body是乙個expression,注意 也是乙個expression。它也可以被寫成這樣 let plus ...