深入理解Rust函数


  团队博客: 汽车电子社区


一、概述

在这里插入图片描述

二、函数要点

  1、函数名和变量名使用蛇形命名法(snake case),例如 fn add_two() -> {}。
  2、函数的位置可以随便放,Rust 不关心我们在哪里定义了函数,只要有定义即可。
  3、每个函数参数都需要标注类型。

三、函数参数

  Rust 是强类型语言,因此需要你为每一个函数参数都标识出它的具体类型,例如:

fn main() {
   
    another_function(5, 6.1);
}

fn another_function(x: i32, y: f32) {
   
    println!("The value of x is: {}", x);
    println!("The value of y is: {}", y);
}

四、函数返回

  在 Rust 中函数就是表达式,因此我们可以把函数的返回值直接赋给调用者。
  函数的返回值就是函数体最后一条表达式的返回值,当然我们也可以使用 return 提前返回,下面的函数使用最后一条表达式来返回一个值:

fn plus_five(x:i32) -> i32 {
   
    x + 5
}

fn main() {
   
    let x = plus_five(5);

    println!("The value of x is: {}", x);
}

  来看两个重点:
    1、let x = plus_five(5),说明我们用一个函数的返回值来初始化 x 变量,因此侧面说明了在 Rust 中函数也是表达式,这种写法等同于 let x = 5 + 5;。
    2、x + 5 没有分号,因为它是一条表达式,这个在上一节中我们也有详细介绍。
  再来看一段代码,同时使用 return 和表达式作为返回值:

fn plus_or_minus(x:i32) -> i32 {
   
    if x > 5 {
   
        return x - 5
    }

    x + 5
}

fn main() {
   
    let x = plus_or_minus(5);

    println!("The value of x is: {}", x);
}

  plus_or_minus 函数根据传入 x 的大小来决定是做加法还是减法,若 x > 5 则通过 return 提前返回 x - 5 的值,否则返回 x + 5 的值。

五、Rust中的特殊返回类型

5.1、无返回值

  单元类型 (),是一个零长度的元组。它没啥作用,但是可以用来表达一个函数没有返回值:
    1、函数没有返回值,那么返回一个 ()。
    2、通过 ; 结尾的表达式返回一个 ()。
  例如下面的 report 函数会隐式返回一个 ():

use std::fmt::Debug;

fn report<T: Debug>(item: T) {
   
  println!("{:?}", item);

}

  与上面的函数返回值相同,但是下面的函数显式的返回了 ():

fn clear(text: &mut String) -> () {
   
  *text = String::from("");
}

  在实际编程中,你会经常在错误提示中看到该 () 的身影出没,假如你的函数需要返回一个 u32 值,但是如果你不幸的以 表达式; 的方式作为函数的最后一行代码,就会报错:

fn add(x:u32,y:u32) -> u32 {
   
    x + y;
}

  只有表达式能返回值,而 ; 结尾的是语句,在 Rust 中,一定要严格区分表达式和语句的区别,这个在其它语言中往往是被忽视的点。

5.2、永不返回的发散函数

  当用 ! 作函数返回类型的时候,表示该函数永不返回( diverge function ),特别的,这种语法往往用做会导致程序崩溃的函数:

fn dead_end() -> ! {
   
  panic!("你已经到了穷途末路,崩溃吧!");
}

  下面的函数创建了一个无限循环,该循环永不跳出,因此函数也永不返回:

fn forever() -> ! {
   
  loop {
   
    //...
  };
}

相关推荐

  1. Rust字符串深入理解

    2024-01-22 20:24:03       17 阅读
  2. 深入理解 Rust 中的元编程

    2024-01-22 20:24:03       35 阅读
  3. 深入理解Rust语句和表达式

    2024-01-22 20:24:03       37 阅读
  4. 【早晨读书会】深入理解rust并发编程

    2024-01-22 20:24:03       9 阅读
  5. 深入理解 c++ 函数模板

    2024-01-22 20:24:03       30 阅读
  6. 深入理解 Linux 函数参数

    2024-01-22 20:24:03       20 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-01-22 20:24:03       17 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-01-22 20:24:03       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-01-22 20:24:03       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-01-22 20:24:03       18 阅读

热门阅读

  1. 深入C++异常处理:构建健壮程序的利器

    2024-01-22 20:24:03       36 阅读
  2. Ubuntu查看版本

    2024-01-22 20:24:03       38 阅读
  3. ANSI C类型限定符

    2024-01-22 20:24:03       40 阅读
  4. 【AI】深度学习在编码中的应用(5)

    2024-01-22 20:24:03       27 阅读
  5. kubectl与 jq的用法

    2024-01-22 20:24:03       34 阅读
  6. 力扣(leetcode)第66题加一(Python)

    2024-01-22 20:24:03       35 阅读
  7. ICMP控制消息 汇总

    2024-01-22 20:24:03       27 阅读
  8. MySQL中对日期时间的处理

    2024-01-22 20:24:03       40 阅读
  9. Python3 如何定位错误:段错误 (核心已转储)

    2024-01-22 20:24:03       38 阅读
  10. 数据结构——基本计算器的实现

    2024-01-22 20:24:03       30 阅读
  11. Redis相关知识

    2024-01-22 20:24:03       36 阅读
  12. 2024.Python

    2024-01-22 20:24:03       38 阅读