zoukankan      html  css  js  c++  java
  • 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);
    }
    
    

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

  • 相关阅读:
    HDFS 2.X新特性
    kettle的系列教程
    Kettle基本使用
    MySQL流程控制结构
    MySQL函数
    MySQL存储过程和函数
    MySQL变量
    MySQL视图
    TCL(事务控制语言)
    MySQL标识列(自增长列)
  • 原文地址:https://www.cnblogs.com/liuhe688/p/13416097.html
Copyright © 2011-2022 走看看