函數參數

參數聲明

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語句的匹配一樣,也可以使用下劃線來表示丟棄一個值。

results matching ""

    No results matching ""