Skip to content

basics.rs

文件信息

  • 📄 原文件:01_basics.rs
  • 🔤 语言:rust

完整代码

rust
// ============================================================
//                      函数基础
// ============================================================
// Rust 中函数使用 fn 关键字定义
// 【命名规范】函数名使用 snake_case(如 my_function)
// 【重要】Rust 不关心函数定义的位置(可以先调用后定义)
// 【重要】函数参数必须标注类型,返回值类型用 -> 标注

fn main() {
    println!("=== 函数基础 ===");

    // ----------------------------------------------------------
    // 1. 基本函数定义与调用
    // ----------------------------------------------------------
    say_hello();
    greet("Rust");
    greet("世界");

    // ----------------------------------------------------------
    // 2. 带返回值的函数
    // ----------------------------------------------------------
    let result = add(3, 5);
    println!("3 + 5 = {}", result);

    let result2 = add_explicit(10, 20);
    println!("10 + 20 = {}", result2);

    // ----------------------------------------------------------
    // 3. 表达式 vs 语句
    // ----------------------------------------------------------
    // 【核心概念】Rust 是基于表达式的语言
    // - 语句(Statement): 执行操作,不返回值,以分号结尾
    // - 表达式(Expression): 计算并返回值,没有分号
    //
    // 【易错点】函数体最后一行不加分号 = 返回该值
    //          函数体最后一行加分号 = 返回 ()

    let result = {
        let x = 10;
        let y = 20;
        x + y  // 没有分号 → 这是表达式,作为块的返回值
    };
    println!("块表达式: {}", result); // 30

    // let bad = { let x = 10; x + 20; };  // 加了分号,返回 ()

    // ----------------------------------------------------------
    // 4. 多返回值(使用元组)
    // ----------------------------------------------------------
    let (sum, product) = sum_and_product(3, 4);
    println!("和={}, 积={}", sum, product);

    // ----------------------------------------------------------
    // 5. 函数作为参数(高阶函数)
    // ----------------------------------------------------------
    let doubled = apply(5, double);
    let squared = apply(5, square);
    println!("apply(5, double) = {}", doubled);
    println!("apply(5, square) = {}", squared);

    // ----------------------------------------------------------
    // 6. 泛型函数
    // ----------------------------------------------------------
    // 使用 <T> 声明泛型参数
    // 使用 trait bound 限制泛型类型的能力

    println!("最大值: {}", max_of(10, 20));
    println!("最大值: {}", max_of(3.14, 2.72));
    println!("最大值: {}", max_of("apple", "banana"));

    // ----------------------------------------------------------
    // 7. 提前返回
    // ----------------------------------------------------------
    println!("分类 0: {}", classify_number(0));
    println!("分类 42: {}", classify_number(42));
    println!("分类 -5: {}", classify_number(-5));

    // ----------------------------------------------------------
    // 8. 发散函数(Never Type)
    // ----------------------------------------------------------
    // 返回类型为 ! 的函数永远不会返回
    // 【适用场景】panic!、无限循环、进程退出等
    // fn forever() -> ! { loop {} }
    // fn crash() -> ! { panic!("boom"); }
    println!("发散函数: 返回 ! 类型的函数永远不会正常返回");

    // ----------------------------------------------------------
    // 9. 方法语法预览
    // ----------------------------------------------------------
    // Rust 中的"方法"是在 impl 块中定义的函数
    // 第一个参数是 self(类似 Python 的 self 或 Go 的接收者)
    // 详细内容见结构体章节

    let rect = Rectangle { width: 30, height: 50 };
    println!("矩形面积: {}", rect.area());
    println!("矩形是否为正方形: {}", rect.is_square());

    // 关联函数(不带 self 的函数,类似静态方法)
    let square = Rectangle::new_square(25);
    println!("正方形: {}x{}", square.width, square.height);

    println!("\n=== 函数基础结束 ===");
}

// ----------------------------------------------------------
// 无参数无返回值
// ----------------------------------------------------------
fn say_hello() {
    println!("Hello, Rust!");
}

// ----------------------------------------------------------
// 带参数的函数
// ----------------------------------------------------------
// 【重要】每个参数都必须标注类型
fn greet(name: &str) {
    println!("你好, {}!", name);
}

// ----------------------------------------------------------
// 带返回值的函数
// ----------------------------------------------------------
// 方式1: 隐式返回(最后一个表达式,不加分号)
// 【推荐】Rust 惯用写法
fn add(a: i32, b: i32) -> i32 {
    a + b  // 没有分号!这就是返回值
}

// 方式2: 显式返回(使用 return 关键字)
// 【适用场景】提前返回时使用
fn add_explicit(a: i32, b: i32) -> i32 {
    return a + b;  // 有分号,因为是 return 语句
}

// ----------------------------------------------------------
// 返回元组(多返回值)
// ----------------------------------------------------------
fn sum_and_product(a: i32, b: i32) -> (i32, i32) {
    (a + b, a * b)
}

// ----------------------------------------------------------
// 函数作为参数
// ----------------------------------------------------------
// fn(i32) -> i32 是函数指针类型
fn apply(value: i32, func: fn(i32) -> i32) -> i32 {
    func(value)
}

fn double(x: i32) -> i32 {
    x * 2
}

fn square(x: i32) -> i32 {
    x * x
}

// ----------------------------------------------------------
// 泛型函数
// ----------------------------------------------------------
// T: PartialOrd 表示 T 必须实现了 PartialOrd trait(可比较大小)
fn max_of<T: PartialOrd>(a: T, b: T) -> T {
    if a >= b { a } else { b }
}

// ----------------------------------------------------------
// 提前返回
// ----------------------------------------------------------
fn classify_number(n: i32) -> &'static str {
    if n == 0 {
        return "零";  // 提前返回
    }
    if n > 0 {
        return "正数";
    }
    "负数"  // 最后的隐式返回
}

// ----------------------------------------------------------
// 方法(在 impl 块中定义)
// ----------------------------------------------------------
struct Rectangle {
    width: f64,
    height: f64,
}

impl Rectangle {
    // 方法:第一个参数是 &self(借用自身)
    fn area(&self) -> f64 {
        self.width * self.height
    }

    fn is_square(&self) -> bool {
        (self.width - self.height).abs() < f64::EPSILON
    }

    // 关联函数:没有 self 参数(类似其他语言的静态方法)
    // 调用时使用 :: 语法(如 Rectangle::new_square(5))
    fn new_square(size: f64) -> Rectangle {
        Rectangle {
            width: size,
            height: size,
        }
    }
}

💬 讨论

使用 GitHub 账号登录后即可参与讨论

基于 MIT 许可发布