函數參數
參數聲明
rust的函數參數聲明和一般的變量聲明相仿,也是參數名後加冒號,冒號後跟參數類型,不過不需要let關鍵字。需要注意的是,普通變量聲明(let語句)是可以省略變量類型的,而函數參數的聲明則不能省略參數類型。
來看一個簡單例子:
fn main() { say_hi("ruster"); } fn say_hi(name: &str) { println!("Hi, {}", name); }
上例中,say_hi函數擁有一個參數,名為name,類型為&str。
將函數作為參數
在rust中,函數是一等公民(可以儲存在變量/數據結構中,可以作為參數傳入函數,可以作為返回值),所以rust的函數參數不僅可以是一般的類型,也可以是函數。如:
fn main() { let xm = "xiaoming"; let xh = "xiaohong"; say_what(xm, hi); say_what(xh, hello); } fn hi(name: &str) { println!("Hi, {}.", name); } fn hello(name: &str) { println!("Hello, {}.", name); } fn say_what(name: &str, func: fn(&str)) { func(name) }
上例中,hi函數和hello函數都是隻有一個&str類型的參數且沒有返回值。而say_what函數則有兩個參數,一個是&str類型,另一個則是函數類型(function type),它是隻有一個&str類型參數且沒有返回值的函數類型。
模式匹配
支持模式匹配,讓rust平添了許多的靈活性,用起來也是十分的舒爽。模式匹配不僅可以用在變量聲明(let語句)中,也可以用在函數參數聲明中,如:
fn main() { let xm = ("xiaoming", 54); let xh = ("xiaohong", 66); print_id(xm); print_id(xh); print_name(xm); print_age(xh); print_name(xm); print_age(xh); } fn print_id((name, age): (&str, i32)) { println!("I'm {},age {}.", name, age); } fn print_age((_, age): (&str, i32)) { println!("My age is {}", age); } fn print_name((name,_): (&str, i32)) { println!("I am {}", name); }
上例是一個元組(Tuple)匹配的例子,當然也可以是其他可在let語句中使用的類型。參數的模式匹配跟let語句的匹配一樣,也可以使用下劃線來表示丟棄一個值。