RUST 学习日记 第18课 ——函数
RUST 学习日记 第18课 ——函数(一)
0x00 回顾与开篇
上节学习了Rust的流程控制,了解了if和while的用法。从这一节课开始咱们进入函数的学习。函数是程序执行的最基本结构,咱们最常见的函数就是main
函数了。从开始接触Rust这门语言,main
函数就伴随着咱们了。
0x01 定义函数
在写代码的时候,不可避免会产生很多重复的代码。这个时候可以将这些重复代码定义成一个函数。定义函数使用fn关键字,其后面紧跟函数名称,函数名称通常以蛇形命名法(snake_case)。函数如果有参数,必须为其指定类型。如果函数存在返回值,也应该为其指定类型。当然,函数的参数和返回值都不是必须的。函数的声明可以在main
函数后面。下面是一个完整的函数表现形式。
fn function_name(parameter: T) -> N {
}
下面通过一个示例来了解下函数。编写一个计算两个整数加法的函数。
示例代码如下:
fn main() {
let a = 5;
let b = 3;
let c = add(a, b);
println!("a + b = {}", c);
}
/// 计算两个数的加法
fn add(a: i32, b: i32) -> i32 {
return a + b;
}
代码运行结果:
a + b = 8
函数参数如果需要可变操作时,可以添加mut关键字,如:mut a: i32
。函数如果存在多个参数,则需要通过逗号分隔。当函数需要返回值时,必须明确返回值类型,且在函数签名后面添加->
符号,其后紧跟函数返回值类型。
PS:Rust中所有的函数都存在返回值,如果没有显示的明确函数的返回值,也会隐式的返回一个单元值()。
示例代码如下:
fn main() {
let d = empty_no_return();
dbg!(d);
}
/// 空函数,无返回值
fn empty_no_return() {
}
代码运行结果:
d = ()
0x02 高阶函数——函数指针
高阶函数就是指以函数为参数或返回值的函数,是函数式编程语言的基础特性。将函数作为一种类型,既可以被调用,也可以作为参数,又可以作为返回值。实现这些操作的基础就是函数指针,函数指针使用fn()来指定。
顾名思义,函数指针就表示是指向函数的指针,它的值就是函数的地址啦。下面看一个例子:
fn say_hello() {
println!("hello!")
}
fn main() {
// 函数赋值,声明类型
let say_hello_ptr: fn() = say_hello;
say_hello_ptr();
// 函数赋值,类型推断
let other_say_hello_ptr= say_hello;
other_say_hello_ptr();
// 原函数调用
say_hello()
}
代码运行结果:
hello!
hello!
hello!
我来解释下上面的代码吧。首先创建了一个say_hello()函数。然后在main()函数中声明了两个函数变量分别是say_hello_ptr和other_say_hello_ptr。然后分别输出。当然函数赋值时,支持类型推断。另外,虽然函数可以赋值给其它变量,但是原函数仍然可以被调用,且函数可以同时赋值给多个变量。
PS:函数赋值时,在等号右边只有函数名,不带有()
。
0x03 小结
本节简单介绍了Rust的函数,对函数有一个初步的了解。下节继续讲解函数的另外两种用法:函数作为参数和函数作为返回值。
0x04 本节源码
018 · StudyRust - 码云 - 开源中国 (gitee.com)
下节预告——函数(二)。