Rust 函數(shù)詳解
Rust 支持多種編程范式,但更偏向于函數(shù)式,函數(shù)在 Rust 中是“一等公民”,函數(shù)可以作為數(shù)據(jù)在程序中進行傳遞。跟 C、C++ 一樣, Rust 也有一個唯一的程序入口 main
函數(shù)。
示例:程序入口 main
函數(shù)
fn main() { println!("Hello, world!"); }
Rust 使用 fn
關(guān)鍵字來聲明和定義函數(shù),使用 snake case
風格來命名函數(shù),即所有的字母小寫并使用下劃線分隔單詞。函數(shù)可以有參數(shù),并且每個函數(shù)都有返回值。
函數(shù)參數(shù)
參數(shù)的聲明方式:參數(shù)名 + 冒號 + 參數(shù)類型
示例:
// 定義一個無參函數(shù) fn function() { println!("A function with no parameters."); } // 定義一個有參函數(shù) fn hello(name: &str) { println!("Hello, {}.", name); }
函數(shù)返回值
在 Rust 中所有函數(shù)都有返回值,main
函數(shù)也不例外,main
函數(shù)的返回值是 ()
(一個空的元組)。在 Rust 中,當一個函數(shù)返回 ()
時,可以省略返回值類型的聲明。main
函數(shù)的完整形式如下:
fn main() -> () { //statements }
()
通常被稱為 unit
或者 unit type
,它其實類似于 C/C++、Java、C#中的 void 類型。
若函數(shù)有其他類型返回值,則需使用 ->
顯式標明返回值類型。像 C/C++ 或 Java 等語言在函數(shù)中需要用 return
語句返回一個值,Rust 與它們不一樣,Rust 默認將函數(shù)中最后一個表達式的結(jié)果作為返回值。
示例:定義一個有返回值的函數(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 的編程風格了 }
在 Rust 中還有一種“沒有返回值”的函數(shù),稱之為發(fā)散函數(shù)(diverging function)。其實,它根本就不返回,它使用感嘆號 !
作為返回類型。
示例:
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ù)會導致當前線程崩潰。
高階函數(shù)
高階函數(shù)與普通函數(shù)的不同在于,它可以使用一個或多個函數(shù)作為參數(shù),可以將函數(shù)作為返回值。既然函數(shù)可以作為參數(shù)和返回值,那么函數(shù)也應(yīng)該有一種相對應(yīng)的數(shù)據(jù)類型,那就是:函數(shù)指針類型。
函數(shù)指針類型
函數(shù)指針類型使用 fn
關(guān)鍵字定義,在編譯時該類型指向一個已知函數(shù)參數(shù)和返回值類型,但函數(shù)體未知的函數(shù)。
示例:
// 函數(shù)定義 fn inc(n: i32) -> i32 { n + 1 } // 使用 `type` 給函數(shù)指針類型起一個別名 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 是一個高階函數(shù),它有兩個參數(shù),一個類型為 `i32`,另一個類型為 `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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Rust重載運算符之復數(shù)四則運算的實現(xiàn)
這篇文章主要為大家詳細介紹了Rust如何實現(xiàn)復數(shù)以及復數(shù)的四則運算,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下2023-08-08

Rust中的Iterator和IntoIterator介紹及應(yīng)用小結(jié)

如何使用VSCode配置Rust開發(fā)環(huán)境(Rust新手教程)