在编程中,函数是一段执行特定任务的代码,它是大多数编程语言中的基本构建块之一。在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
函数接受两个参数,a
和b
,它们都是32位整数(i32
是Rust中32位整数的类型)。 -
-> i32
:箭头->
后面跟着的是函数的返回类型。在这个例子中,add
函数返回一个32位整数。 -
{ a + b }
:函数的主体是一个表达式,它将两个参数a
和b
相加。由于这是一个表达式,并且是函数的唯一语句,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的字符就行了。用的时候不用关心它到底怎么实现的。
- 这很符合人理解事物的思维习惯,从一堆操作中抽象一个概念,再组合概念形成新的概念。