exercises/02_functions
functions1.rs - 函数定义与调用
问题代码
fn main() {
call_me();
}
解题要点
- 错误原因: 缺少
call_me 函数定义,但 main 函数中调用了该函数
- 解决方法: 定义一个无参数无返回值的函数
fn call_me() {}
正确写法
fn call_me() {
}
fn main() {
call_me();
}
functions2.rs - 函数参数类型
问题代码
fn call_me(num:) {
for i in 0..num {
println!("Ring! Call number {}", i + 1);
}
}
fn main() {
call_me(3);
}
解题要点
- 错误原因: 函数参数
num 缺少类型注解,Rust 要求所有参数必须显式指定类型
- 解决方法: 为参数添加类型注解,根据使用场景推断为整数类型
正确写法
fn call_me(num: u32) {
for i in 0..num {
println!("Ring! Call number {}", i + 1);
}
}
fn main() {
call_me(3);
}
functions3.rs - 函数调用参数匹配
问题代码
fn call_me(num: u8) {
for i in 0..num {
println!("Ring! Call number {}", i + 1);
}
}
fn main() {
call_me();
}
解题要点
- 错误原因: 函数定义需要一个参数,但调用时没有提供参数
- 解决方法: 调用时传入符合类型要求的参数值
正确写法
fn call_me(num: u8) {
for i in 0..num {
println!("Ring! Call number {}", i + 1);
}
}
fn main() {
call_me(5);
}
functions4.rs - 函数返回值类型
问题代码
fn is_even(num: i64) -> bool {
num % 2 == 0
}
fn sale_price(price: i64) -> {
if is_even(price) {
price - 10
} else {
price - 3
}
}
fn main() {
let original_price = 51;
println!("Your sale price is {}", sale_price(original_price));
}
解题要点
- 错误原因: 函数
sale_price 的返回值类型注解不完整,缺少具体类型
- 解决方法: 根据函数体返回的表达式类型,指定返回值类型为
i64
正确写法
fn is_even(num: i64) -> bool {
num % 2 == 0
}
fn sale_price(price: i64) -> i64 {
if is_even(price) {
price - 10
} else {
price - 3
}
}
fn main() {
let original_price = 51;
println!("Your sale price is {}", sale_price(original_price));
}
functions5.rs - 函数返回值表达式
问题代码
fn square(num: i32) -> i32 {
num * num;
}
fn main() {
let answer = square(3);
println!("The square of 3 is {answer}");
}
解题要点
- 错误原因: 函数体中
num * num; 是语句而不是表达式,没有返回值
- 解决方法: 去掉分号,使其成为表达式并返回计算结果
正确写法
fn square(num: i32) -> i32 {
num * num
}
fn main() {
let answer = square(3);
println!("The square of 3 is {answer}");
}
知识点汇总
函数基础
- 函数定义: 使用
fn function_name() {} 定义函数,如 fn call_me() {}
- 函数调用: 直接使用函数名和参数调用,如
call_me(3)
- 函数参数: 所有参数必须显式指定类型,如
num: u32
函数签名
- 参数类型注解: Rust 要求每个参数都有类型注解,不能省略
- 返回值类型: 使用
-> Type 指定返回值类型,如 -> i64
- 无返回值: 可以省略返回值类型或使用
-> ()
函数体与返回值
- 语句与表达式: 语句以分号结尾不返回值,表达式无分号返回值
- 隐式返回: 函数体最后一个表达式会作为返回值
- 返回关键字: 也可以使用
return 显式返回值