Rust: 函数

是时候介绍一下函数了。

前面我们梳理基础知识点时,都是将代码放入一个 main 函数中来演示的,一个 fn 关键字,加上一个 main 作为函数名,完事儿:

// 入口函数
fn main() {
    println!("hello world");
}

如果你写过 Java 代码,就绝对能感受到 Rust 是多么的简洁。

在实际应用中,由于逻辑比较复杂,我们需要将代码拆分开,以功能为单位,封装到不同的函数中去,供外部调用。我们可以定义自己的函数,如果函数名由多个单词组成,则需要使用下划线风格:

fn test() {
    println!("test");
}

fn test_function() {
    println!("test_function");
}

fn main() {
    test();
    test_function();
}

Rust 不会限制函数定义的位置,函数可以放在哪里,这是你的自由:

// 我定义在先
fn first() {
    println!("first");
}

fn main() {
    first();
    second();
    third();
    
    // 我定义在main函数中
    fn second() {
        println!("second");
    }
}

// 我定义在main之后
fn third() {
    println!("third");
}

函数的参数也很简单,括号内声明一个参数名,后面跟上类型即可(与变量声明不同,这里的类型不能省略):

fn main() {
    show_number(3);
}

// 参数必须声明类型
fn show_number(n: i32) {
    println!("the number is: {}", n);
}

类似地,我们可以在括号内声明多个参数:

fn main() {
    add(3, 5);
}

// 多个参数
fn add(a: i32, b: i32) {
    let sum = a + b;
    println!("sum: {}", sum);
}

函数可以有返回值,只需括号后面跟上返回值的类型即可:

fn main() {
    let sum = add(3, 5);
    println!("sum: {}", sum);

    let sum = add2(3, 6);
    println!("sum: {}", sum);
}

// 返回值是i32类型
fn add(a: i32, b: i32) -> i32 {
    // 表达式返回值
    a + b
}

fn add2(a: i32, b: i32) -> i32 {
  	// return语句返回
    return a + b;
}

我们可以使用一个表达式来返回结果,也可以使用 return 语句返回。Rust 推崇使用表达式,但有时候使用 return 会让代码更清晰。

函数可以绑定变量,绑定之后,变量可以作为函数来调用:

fn main() {
    // 函数绑定变量
    let add_fn = add;
    
  	// 调用函数
    let sum = add_fn(3, 5);
    
    println!("sum: {}", sum);
}

fn add(a: i32, b: i32) -> i32 {
    a + b
}

上面在进行绑定时,没有指定类型,编译器会自动推导出函数的类型,即 fn(i32, i32) -> i32 ,我们也可以显式声明函数的类型:

fn main() {
    // 显式声明函数类型
    let add_fn: fn(i32, i32) -> i32 = add;
    
    let sum = add_fn(3, 5);
    
    println!("sum: {}", sum);
}

fn add(a: i32, b: i32) -> i32 {
    a + b
}

最后,函数也可以作为参数传递到其他函数中,进而在内部调用。且看下面一个购物打折的示例:

// 减10元折扣
fn discount10(total: i32) -> i32 {
    total - 10
}

// 减20元折扣
fn discount20(total: i32) -> i32 {
    total - 20
}

// 计算最终价格
fn calc(
        discount: fn(i32) -> i32,
        total: i32
    ) -> i32 {
    // 打折后再减5元
    return discount(total) - 5;
}

fn main() {
    let total = 150;
    
  	// 传入 discount10 函数
    let pay = calc(discount10, total);
    
  	// 打印结果 135
    println!("{}", pay);

  	// 传入 discount20 函数
    let pay = calc(discount20, total);
    
  	// 打印结果 125
    println!("{}", pay);
}

以上就是函数最基本的用法,今天就先介绍到这里吧。

posted @ 2019-11-25 19:16  liuhe688  阅读(322)  评论(0编辑  收藏  举报