• 函数参数
    • 参数声明
    • 将函数作为参数
    • 模式匹配

    函数参数

    参数声明

    rust的函数参数声明和一般的变量声明相仿,也是参数名后加冒号,冒号后跟参数类型,不过不需要let关键字。需要注意的是,普通变量声明(let语句)是可以省略变量类型的,而函数参数的声明则不能省略参数类型。
    来看一个简单例子:

    1. fn main() {
    2. say_hi("ruster");
    3. }
    4. fn say_hi(name: &str) {
    5. println!("Hi, {}", name);
    6. }

    上例中,say_hi函数拥有一个参数,名为name,类型为&str

    将函数作为参数

    在rust中,函数是一等公民(可以储存在变量/数据结构中,可以作为参数传入函数,可以作为返回值),所以rust的函数参数不仅可以是一般的类型,也可以是函数。如:

    1. fn main() {
    2. let xm = "xiaoming";
    3. let xh = "xiaohong";
    4. say_what(xm, hi);
    5. say_what(xh, hello);
    6. }
    7. fn hi(name: &str) {
    8. println!("Hi, {}.", name);
    9. }
    10. fn hello(name: &str) {
    11. println!("Hello, {}.", name);
    12. }
    13. fn say_what(name: &str, func: fn(&str)) {
    14. func(name)
    15. }

    上例中,hi函数和hello函数都是只有一个&str类型的参数且没有返回值。而say_what函数则有两个参数,一个是&str类型,另一个则是函数类型(function type),它是只有一个&str类型参数且没有返回值的函数类型。

    模式匹配

    支持模式匹配,让rust平添了许多的灵活性,用起来也是十分的舒爽。模式匹配不仅可以用在变量声明(let语句)中,也可以用在函数参数声明中,如:

    1. fn main() {
    2. let xm = ("xiaoming", 54);
    3. let xh = ("xiaohong", 66);
    4. print_id(xm);
    5. print_id(xh);
    6. print_name(xm);
    7. print_age(xh);
    8. print_name(xm);
    9. print_age(xh);
    10. }
    11. fn print_id((name, age): (&str, i32)) {
    12. println!("I'm {},age {}.", name, age);
    13. }
    14. fn print_age((_, age): (&str, i32)) {
    15. println!("My age is {}", age);
    16. }
    17. fn print_name((name,_): (&str, i32)) {
    18. println!("I am {}", name);
    19. }

    上例是一个元组(Tuple)匹配的例子,当然也可以是其他可在let语句中使用的类型。参数的模式匹配跟let语句的匹配一样,也可以使用下划线来表示丢弃一个值。