当前位置: 首页>后端>正文

rust学习-4.0-函数

在编程中,函数是一段执行特定任务的代码,它是大多数编程语言中的基本构建块之一。在Rust中,函数也是组织代码和实现逻辑的关键工具。
函数就是一种过程抽象。举个例子,开锁就是指代,你掏出钥匙,插入钥匙孔,顺时针旋转钥匙,这一系列复杂过程。用开锁两个字抽象了你的复杂操作。

基本语法

Rust中的函数定义的基本语法如下:

fn function_name(parameters) -> return_type {
    // 函数体
}
  • fn 关键字用于声明一个函数。
  • function_name 是函数的名称。
  • parameters 是传递给函数的参数列表,用括号括起来,多个参数用逗号分隔。
  • -> 运算符后跟 return_type,表示函数返回值的型。
  • {} 中的是函数体,包含了执行任务的代码。

示例1:无参数无返回值的函数

fn greet() {
    println!("Hello, world!");
}
  • fn:这是Rust中声明函数的关键字。
  • greet:这是函数的名称。
  • ():括号内是函数的参数列表。在这个例子中,greet函数不接受任何参数,所以括号内为空。
  • {}:大括号内是函数的主体,也就是函数执行时运行的代码。在这个例子中,函数的主体是一条打印"Hello, world!"到控制台的语句。
  • ;:在Rust中,除了函数主体和表达式的结尾,大多数语句都需要以分号;结束。由于greet函数的主体是一个表达式(println!宏调用),所以这里不需要分号。

示例2:带参数和返回值的函数

fn add(a: i32, b: i32) -> i32 {
    a + b
}
  • fn:声明函数的关键字。
  • add:函数的名称。
  • (a: i32, b: i32):括号内是参数列表。这里add函数接受两个参数,ab,它们都是32位整数(i32是Rust中32位整数的类型)。
  • -> i32:箭头->后面跟着的是函数的返回类型。在这个例子中,add函数返回一个32位整数。
  • { a + b }:函数的主体是一个表达式,它将两个参数ab相加。由于这是一个表达式,并且是函数的唯一语句,Rust会自动返回这个表达式的结果。
    在这两个例子中,greet函数是一个简单的函数,它不接受任何参数,也没有返回值。而add函数接受两个参数,计算它们的和,并返回这个和。在Rust中,函数的返回值是通过返回值类型的表达式隐式返回的,不需要使用return关键字。

函数特性

  • 表达式 vs 语句:在Rust中,函数体的最后一个表达式不需要分号,这意味着它将作为返回值。如果加上分号,它就变成了语句,不会返回任何值。
  • 参数类型:Rust是静态类型语言,函数参数和返回值都必须明确指定类型。
  • 返回值:如果函数不需要返回值,可以省略 -> return_type 部分,或者使用 () 作为返回类型。

函数的调用

fn main() {
    let result = level_one();
    println!("最终结果是: {}", result);
}
fn level_one() -> i32 {
    let partial_result = level_two();
    // 做一些处理
    partial_result + 10
}
fn level_two() -> i32 {
    let partial_result = level_three();
    // 做一些处理
    partial_result * 2
}
fn level_three() -> i32 {
    // 假设这是最低层的函数,它不调用其他函数
    5
}

在这个例子中:

  • main 调用 level_one 函数。
  • level_one 函数调用 level_two 函数。
  • level_two 函数调用 level_three 函数。
  • level_three 函数是最低层的函数,它不调用其他函数。
    每个函数执行一些操作,然后可能将结果传递给调用它的函数。最终,main 函数打印出最终的结果。
    这种层层调用的方式可以帮助你组织代码,使其更加模块化和可维护。

函数调用修改习题代码

//修改前
fn practice_loop_statement_01(){
    println!("1到10的整数。");
    for i in 1..=10{
        println!("{}",i);
    }
}
//修改后
fn practice_loop_statement_01(){
    println!("1到10的整数。{}",get_string(10));
    
}
fn get_string(number:usize)->String{
    let mut result = String::new();
    for i in 1..=number{
        result += &format!("\n{}", i);
    }
    result
}
  • "\n"是转义符号,一种特殊的字符,含义是换行
  • 这么改的好处是什么?你只要关心get_string这个名字和参数10。不需要考虑其他
  • 而修改前,你还需要关心for循环干了什么事情。这是简单代码你觉得没什么,一旦逻辑复杂起来就非常痛苦了。
  • 说到底这种修改对于机器来说是脱了裤子放屁,多此一举。
  • 但对于编程人员来说,少了理解的心智负担。你只需要记得给10,函数给你1到10的字符就行了。用的时候不用关心它到底怎么实现的。
  • 这很符合人理解事物的思维习惯,从一堆操作中抽象一个概念,再组合概念形成新的概念。

https://www.xamrdz.com/backend/3u21924186.html

相关文章: