閉包就是匿名函式或者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 ...