rust 函式 和 閉包 10

2021-10-17 14:27:06 字數 2769 閱讀 7468

目錄

一,函式

(一)函式的宣告格式

(二)用函式實現兩數交換值

二,閉包

(一)閉包的宣告格式

(二)使用閉包實現兩數交換值

三,異同

(一)作用域不同

(二)三個特性(所有權,可變借用和不可變借用)一致

1,所有權

2,借用

3,可變借用

&mut修飾符在變數名前,函式定義時形式引數必須宣告型別,這是出於安全的考慮,這樣就不需要再進行推斷了。

fn fn_name( 變數名 :[&mut] 變數型別 [,...]) -> 返回型別

fn fn_name( 變數名 :[&mut] 變數型別 [,...])

fn main()  , num2:{}", num1,num2);

//第一次交換

let array = chang_num(num1 , num2);

num1 = ;

num2 = array[1] ;

println!("num1:{} , num2:{}", num1,num2);

//第二次交換

num1 = ;

println!("num1:{} , num2:{}", num1,num2);

}fn chang_num(num1 : i32 , num2:i32) ->[i32;2]

乙個可以儲存在變數裡的類似函式的結構。閉包通常很短並只與對應相對任意的場景較小的上下文中。編譯器能可靠的推斷引數和返回值的型別,類似於它是如何能夠推斷大部分變數的型別一樣。

相同的閉包在相同的上下文內,不允許有不同的引數型別。型別是在第一次傳引數時確定的。

//函式定義

fn fn1(x: u32) -> u32

fn main() ; //完整標註的閉包定義

let closures2 = |x| println!("{}", x + 1); //省略了型別註解,去掉了可選的大括號

let num = closures2(1);//2

// let num1 = closures2(1.0); //expected integer, found floating-point number

}

fn main()  ,y{}", x, y);

let mut temp = x;

x = y;

y = temp;

println!("交換後 x{} ,y{}", x, y)

};closures(1, 2);

}console:

交換前 x1 ,y2

交換後 x2 ,y1

閉包的定義:乙個可以儲存在變數裡的類似函式的結構。閉包與變數是有相同的作用域,可以直接使用變數。而函式不可以

fn compare(x: i32, y: i32) ", x == y);

}fn main() ", x == a);

//無法直接獲得a

// fn compare2(z: i32) ", x == a)

// }

//但可以傳入來實現

fn compare3(z: i32, a: i32) ", z == a)

}compare1(1);

compare3(1, a);

}

閉包可以通過三種方式捕獲其環境,他們直接對應函式的三種獲取引數的方式:獲取所有權,可變借用和不可變借用。

如果你希望強制閉包獲取其使用的環境值的所有權,可以在引數列表前使用move關鍵字。這個技巧在將閉包傳遞給新執行緒以便將資料移動到新執行緒中時最為實用。閉包只能獲取相同變數的一次所有權。

let y = "1".to_string();

let compare1 = move |x: string| x.len() == y.len();

// println!("{}", y); //borrow of moved value: `y`

let z = "1".to_string();

fn compare3(a: string, b: string) -> bool

compare3("1".to_string(), z);

println!("{}", z);//borrow of moved value: `z`

從其環境獲取不可變的借用值。雖然不能改變值,但可以在外層列印使用。

fn main() ", y);

};add();

println!("{}", y);

fn compare3(b: &i32) ", b);

}let mut z = 2;

compare3(&z);

println!("{}", z);

}

可變的借用值所以可以改變其環境。

fn main() ;

add("+1");

println!("{}", y);

fn compare3(b: &mut string)

let mut z = string::from("函式 1");

compare3(&mut z);

println!("{}", z);

}

Rust閉包小結

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

rust學習 閉包 closuer

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

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 內部的是捕獲的周圍的變數,預設捕獲的是不可變借用,先給出乙個實...