Rust 函數(shù)詳解
Rust 支持多種編程范式,但更偏向于函數(shù)式,函數(shù)在 Rust 中是“一等公民”,函數(shù)可以作為數(shù)據(jù)在程序中進(jìn)行傳遞。跟 C、C++ 一樣, Rust 也有一個(gè)唯一的程序入口 main 函數(shù)。
示例:程序入口 main 函數(shù)
fn main() {
println!("Hello, world!");
}
Rust 使用 fn 關(guān)鍵字來聲明和定義函數(shù),使用 snake case 風(fēng)格來命名函數(shù),即所有的字母小寫并使用下劃線分隔單詞。函數(shù)可以有參數(shù),并且每個(gè)函數(shù)都有返回值。
函數(shù)參數(shù)
參數(shù)的聲明方式:參數(shù)名 + 冒號(hào) + 參數(shù)類型
示例:
// 定義一個(gè)無參函數(shù)
fn function() {
println!("A function with no parameters.");
}
// 定義一個(gè)有參函數(shù)
fn hello(name: &str) {
println!("Hello, {}.", name);
}
函數(shù)返回值
在 Rust 中所有函數(shù)都有返回值,main 函數(shù)也不例外,main 函數(shù)的返回值是 ()(一個(gè)空的元組)。在 Rust 中,當(dāng)一個(gè)函數(shù)返回 () 時(shí),可以省略返回值類型的聲明。main 函數(shù)的完整形式如下:
fn main() -> () {
//statements
}
() 通常被稱為 unit 或者 unit type,它其實(shí)類似于 C/C++、Java、C#中的 void 類型。
若函數(shù)有其他類型返回值,則需使用 -> 顯式標(biāo)明返回值類型。像 C/C++ 或 Java 等語言在函數(shù)中需要用 return 語句返回一個(gè)值,Rust 與它們不一樣,Rust 默認(rèn)將函數(shù)中最后一個(gè)表達(dá)式的結(jié)果作為返回值。
示例:定義一個(gè)有返回值的函數(shù)
fn main() {
let x = plus_one(5);
println!("The value of x is: {}", x);
}
fn plus_one(x: i32) -> i32 {
x + 1
}
Rust 也有 return 關(guān)鍵字,不過一般用于提前返回。
示例:在函數(shù)中使用 return
fn main() {
let a = [1,3,2,5,9,8];
println!("There is 7 in the array: {}", find(7, &a));
println!("There is 8 in the array: {}", find(8, &a));
}
fn find(n: i32, a: &[i32]) -> bool {
for i in a {
if *i == n {
return true;
}
}
false // 這里也可以改為 `return false;`,但這就不是 Rust 的編程風(fēng)格了
}
在 Rust 中還有一種“沒有返回值”的函數(shù),稱之為發(fā)散函數(shù)(diverging function)。其實(shí),它根本就不返回,它使用感嘆號(hào) ! 作為返回類型。
示例:
fn main() {
println!("hello");
diverging();
println!("world");
}
fn diverging() -> ! {
panic!("This function will never return");
}
發(fā)散函數(shù)一般都以 panic! 宏調(diào)用或其他調(diào)用其他發(fā)散函數(shù)結(jié)束,所以,調(diào)用發(fā)散函數(shù)會(huì)導(dǎo)致當(dāng)前線程崩潰。
高階函數(shù)
高階函數(shù)與普通函數(shù)的不同在于,它可以使用一個(gè)或多個(gè)函數(shù)作為參數(shù),可以將函數(shù)作為返回值。既然函數(shù)可以作為參數(shù)和返回值,那么函數(shù)也應(yīng)該有一種相對(duì)應(yīng)的數(shù)據(jù)類型,那就是:函數(shù)指針類型。
函數(shù)指針類型
函數(shù)指針類型使用 fn 關(guān)鍵字定義,在編譯時(shí)該類型指向一個(gè)已知函數(shù)參數(shù)和返回值類型,但函數(shù)體未知的函數(shù)。
示例:
// 函數(shù)定義
fn inc(n: i32) -> i32 {
n + 1
}
// 使用 `type` 給函數(shù)指針類型起一個(gè)別名
type IncType = fn(i32) -> i32;
fn main() {
// 使用函數(shù)指針類型 `fn(i32) -> i32`
let func: fn(i32) -> i32 = inc;
println!("3 + 1 = {}", func(3));
// 使用函數(shù)指針類型的別名 `IncType`
let func: IncType = inc;
println!("4 + 1 = {}", func(4));
}
函數(shù)作為參數(shù)
函數(shù)作為參數(shù),其聲明與普通參數(shù)一樣。
示例:高階函數(shù)
fn main() {
println!("3 + 1 = {}", process(3, inc));
println!("3 - 1 = {}", process(3, dec));
}
fn inc(n: i32) -> i32 {
n + 1
}
fn dec(n: i32) -> i32 {
n - 1
}
// process 是一個(gè)高階函數(shù),它有兩個(gè)參數(shù),一個(gè)類型為 `i32`,另一個(gè)類型為 `fn(i32)->i32`
fn process(n: i32, func: fn(i32) -> i32) -> i32 {
func(n)
}
函數(shù)作為返回值
函數(shù)作為返回值,其聲明與普通函數(shù)的返回值類型聲明一樣。
示例:
fn main() {
let a = [1,2,3,4,5,6,7];
let mut b = Vec::<i32>::new();
for i in &a {
b.push(get_func(*i)(*i));
}
println!("{:?}", b);
}
// 若傳入的參數(shù)為偶數(shù),返回 `inc`,否則返回 `dec`
fn get_func(n: i32) -> fn(i32) -> i32 {
fn inc(n: i32) -> i32 {
n + 1
}
fn dec(n: i32) -> i32 {
n - 1
}
if n % 2 == 0 {
inc
} else {
dec
}
}
相關(guān)資料
到此這篇關(guān)于Rust 函數(shù)的文章就介紹到這了,更多相關(guān)Rust 函數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Rust重載運(yùn)算符之復(fù)數(shù)四則運(yùn)算的實(shí)現(xiàn)
這篇文章主要為大家詳細(xì)介紹了Rust如何實(shí)現(xiàn)復(fù)數(shù)以及復(fù)數(shù)的四則運(yùn)算,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-08-08
Rust中的Iterator和IntoIterator介紹及應(yīng)用小結(jié)
如何使用VSCode配置Rust開發(fā)環(huán)境(Rust新手教程)

