rustlings 学习笔记 -- exercises/02_functions

11 阅读3分钟

exercises/02_functions

functions1.rs - 函数定义与调用

问题代码

// TODO: Add some function with the name `call_me` without arguments or a return value.

fn main() {
    call_me(); // Don't change this line
}

解题要点

  • 错误原因: 缺少 call_me 函数定义,但 main 函数中调用了该函数
  • 解决方法: 定义一个无参数无返回值的函数 fn call_me() {}

正确写法

fn call_me() {
    // 函数体可以为空
}

fn main() {
    call_me(); // Don't change this line
}

functions2.rs - 函数参数类型

问题代码

// TODO: Add the missing type of the argument `num` after the colon `:`.
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() {
    // TODO: Fix the function call.
    call_me();
}

解题要点

  • 错误原因: 函数定义需要一个参数,但调用时没有提供参数
  • 解决方法: 调用时传入符合类型要求的参数值

正确写法

fn call_me(num: u8) {
    for i in 0..num {
        println!("Ring! Call number {}", i + 1);
    }
}

fn main() {
    call_me(5); // 传入一个 u8 类型的值
}

functions4.rs - 函数返回值类型

问题代码

// This store is having a sale where if the price is an even number, you get 10
// Rustbucks off, but if it's an odd number, it's 3 Rustbucks off.
// Don't worry about the function bodies themselves, we are only interested in
// the signatures for now.

fn is_even(num: i64) -> bool {
    num % 2 == 0
}

// TODO: Fix the function signature.
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 - 函数返回值表达式

问题代码

// TODO: Fix the function body without changing the signature.
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 显式返回值