简介
函数为一段操作命名,使程序可以在需要时调用这段操作。函数可以通过参数接收输入,并返回计算结果。
本实验提供了一个准备好的 Cargo 项目,其中包含三个转换函数及其全部调用代码。你将在每个步骤中替换一个占位表达式。这样既能减少输入量,也能展示函数定义、参数、返回类型、表达式和函数调用如何结合使用。
从函数返回值
在本步骤中,你将完成一个把分钟转换为秒的函数,并将函数定义与函数调用连接起来。
进入准备好的项目并打开源文件:
cd /home/labex/project/conversion-tool
nano src/main.rs
文件顶部的这一行开始定义一个函数:
fn minutes_to_seconds(minutes: i32) -> i32 {
fn用于声明函数。minutes_to_seconds是函数名。minutes: i32是一个参数:参数名为minutes,类型为整数类型i32。-> i32表示该函数返回一个i32值。- 花括号中的内容是函数体。
Rust 会根据这个函数签名检查每次调用。调用方必须按照声明顺序提供正确数量的实参,并且每个实参的类型都必须兼容。
只替换 Step 1 注释前面的 0,替换为:
minutes * 60 // Step 1: replace this placeholder expression.
注意,minutes * 60 末尾没有分号。它是函数体中的最后一个表达式,因此其值会成为函数的返回值。如果添加分号,它就会变成一条不会返回该值的语句。
使用 Ctrl+O 保存,按 Enter 确认,然后使用 Ctrl+X 退出。检查代码:
cargo check
在 main 中,minutes_to_seconds(5) 是一次函数调用。值 5 是传递给 minutes 参数的实参。运行程序:
cargo run --quiet
此时,输出的第一行应为:
5 minutes = 300 seconds
使用小数参数和返回类型
在本步骤中,你将完成第二个函数。该函数接收并返回浮点数值。
打开源文件:
nano src/main.rs
找到 celsius_to_fahrenheit。它的参数和返回类型都是 f64,因此计算结果可以保留小数部分。临时表达式 celsius * 0.0 使用了参数,但会刻意返回零。将整个表达式替换为:
celsius * 9.0 / 5.0 + 32.0 // Step 2: replace this placeholder expression.
这同样是通过表达式返回值:计算结果是函数体中的最后一项,并且末尾没有分号。按照通常的算术优先级,乘法和除法会先于加法执行。对于更复杂的计算顺序,可以使用括号明确表达意图。调用方不需要了解计算公式,只需提供摄氏温度实参并接收返回的华氏温度值。
保存并退出,然后运行程序:
cargo run --quiet
第二行应为:
20.0 C = 68.0 F
调用 celsius_to_fahrenheit(20.0) 时会传入一个实参。函数返回的值会先存储到 fahrenheit 绑定中,然后再格式化并显示。
使用多个实参复用函数
在本步骤中,你将完成一个包含两个参数的函数,并观察两个调用如何复用该函数。
准备好的 scale_amount 函数接收 amount 和 factor。参数之间使用逗号分隔,每个参数都有自己的类型。调用时必须按照相同顺序提供实参。
打开文件并找到 Step 3 的占位表达式:
nano src/main.rs
临时表达式 amount * factor * 0.0 会刻意返回零。将整个表达式替换为:
amount * factor // Step 3: replace this placeholder expression.
保存并退出,然后执行最后一次检查:
cargo check
运行完成后的程序:
cargo run --quiet
同一个函数会分别为面粉和水调用一次。最后两行应为:
Scaled flour: 375.0 g
Scaled water: 270.0 ml
这就是函数的主要优势:只定义一次计算,为它指定清晰的名称,然后使用不同的实参重复调用。
总结
你完成了带有整数和浮点数参数的函数,读懂了返回类型箭头,使用函数体末尾的表达式返回值,在函数调用中传递实参,并复用了一个函数来完成多次计算。



