rust筆記13 閉包

2021-09-26 14:56:38 字數 1101 閱讀 5200

閉包是乙個可捕獲周圍環境的可執行**片段,基本的幾個定義方式如下:

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 ;

| |內部的是捕獲的周圍的變數,預設捕獲的是不可變借用,先給出乙個實際**片段:

use std::thread;

use std::time::duration;

fn main() milliseconds", num);

};let num = 200;

foo(num);

}

注意:閉包一般不必顯式宣告變數的型別,但是閉包只能推斷一種型別的資料,再次出現其它型別的資料時會報錯。給出**說明:

fn main()
如果我們想讓閉包在第一次呼叫時就儲存好結果,之後返回第一次計算的結果,可以使用快取的機制,下面**給出一般的快取機制。但是,這個機制存在乙個問題,如果第一次有了計算結果了,那麼再次傳入新的值,返回的也是第一次計算的結果。

struct cachewhere t: fn(u32) -> u32  // 注意這裡閉包宣告的方式

implcachewhere t: fn(u32) -> u32

}fn value(&mut self, arg: u32) -> u32 ,}}

}fn main() );

let v1 = res.value(2);

let v2 = res.value(10); // 這仍然會返回之前的結果

println!("v1 = {}, v2 = {}", v1, v2); // v1 = 4, v2 = 4

}

如果想要根據不同的值計算結果,可以利用hashmap等的思路。

閉包三種捕獲方式,附帶3種宣告方式:

Rust基礎筆記 閉包

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

Rust閉包小結

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

rust學習 閉包 closuer

閉包就是匿名函式或者lambda表示式,由於rust的一些特殊語法,rust中的閉包與其他語言有些不一樣的用法,每次看過很容易忘記,特此記錄。閉包的基本定義方法是 使用 替代 將輸入變數括起來。區塊定界符 將所有函式中的表示式擴起來,如果只有一條表示式也可以不加。閉包與函式的一大區別是,閉包能夠在內...