函数基础 #

一、函数定义 #

1.1 基本语法 #

使用 fn 关键字定义函数:

rust
fn greet() {
    println!("Hello, Rust!");
}

fn main() {
    greet();
}

1.2 函数位置 #

函数可以定义在任意位置:

rust
fn main() {
    greet();  // 可以调用后面定义的函数
}

fn greet() {
    println!("Hello!");
}

二、函数参数 #

2.1 参数定义 #

rust
fn greet(name: &str) {
    println!("Hello, {}!", name);
}

fn main() {
    greet("Alice");
}

2.2 多个参数 #

rust
fn print_info(name: &str, age: u32) {
    println!("{} is {} years old", name, age);
}

fn main() {
    print_info("Alice", 30);
}

2.3 参数类型 #

必须显式标注参数类型:

rust
fn add(a: i32, b: i32) -> i32 {
    a + b
}

fn main() {
    let result = add(5, 3);
    println!("Result: {}", result);
}

三、返回值 #

3.1 返回值类型 #

使用 -> 指定返回值类型:

rust
fn add(a: i32, b: i32) -> i32 {
    a + b
}

fn main() {
    let sum = add(5, 3);
    println!("Sum: {}", sum);
}

3.2 return 关键字 #

使用 return 提前返回:

rust
fn abs(x: i32) -> i32 {
    if x < 0 {
        return -x;
    }
    x
}

fn main() {
    println!("abs(-5) = {}", abs(-5));
    println!("abs(5) = {}", abs(5));
}

3.3 表达式返回 #

最后一个表达式作为返回值(无分号):

rust
fn add(a: i32, b: i32) -> i32 {
    a + b  // 无分号,作为返回值
}

fn add_with_semicolon(a: i32, b: i32) -> i32 {
    return a + b;  // 使用 return
}

3.4 无返回值 #

无返回值函数返回单元类型 ()

rust
fn greet(name: &str) {
    println!("Hello, {}!", name);
}

// 等价于
fn greet_explicit(name: &str) -> () {
    println!("Hello, {}!", name);
}

四、语句与表达式 #

4.1 语句 #

语句执行操作,不返回值:

rust
fn main() {
    let x = 5;  // 语句
}

4.2 表达式 #

表达式返回值:

rust
fn main() {
    let y = {
        let x = 3;
        x + 1  // 表达式,返回 4
    };
    
    println!("y = {}", y);
}

4.3 区别 #

rust
fn main() {
    let x = 5;
    
    // 表达式(无分号)
    let y = {
        x + 1
    };
    println!("y = {}", y);  // 6
    
    // 语句(有分号)
    let z = {
        x + 1;  // 返回 ()
    };
    println!("z = {:?}", z);  // ()
}

五、所有权与函数 #

5.1 值传递 #

传递值会转移所有权:

rust
fn take_ownership(s: String) {
    println!("{}", s);
}

fn main() {
    let s = String::from("hello");
    take_ownership(s);
    // println!("{}", s);  // 错误:s 已移动
}

5.2 引用传递 #

传递引用不转移所有权:

rust
fn borrow_string(s: &String) {
    println!("{}", s);
}

fn main() {
    let s = String::from("hello");
    borrow_string(&s);
    println!("{}", s);  // 正确:s 仍然有效
}

5.3 可变引用 #

rust
fn append_world(s: &mut String) {
    s.push_str(", world");
}

fn main() {
    let mut s = String::from("hello");
    append_world(&mut s);
    println!("{}", s);  // hello, world
}

5.4 返回所有权 #

rust
fn give_ownership() -> String {
    String::from("hello")
}

fn take_and_return(s: String) -> String {
    s
}

fn main() {
    let s1 = give_ownership();
    println!("{}", s1);
    
    let s2 = take_and_return(s1);
    // println!("{}", s1);  // 错误:s1 已移动
    println!("{}", s2);
}

六、实践示例 #

6.1 数学函数 #

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

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

fn factorial(n: u32) -> u32 {
    if n <= 1 {
        1
    } else {
        n * factorial(n - 1)
    }
}

fn main() {
    println!("square(5) = {}", square(5));
    println!("cube(3) = {}", cube(3));
    println!("factorial(5) = {}", factorial(5));
}

6.2 字符串处理 #

rust
fn first_word(s: &str) -> &str {
    let bytes = s.as_bytes();
    
    for (i, &item) in bytes.iter().enumerate() {
        if item == b' ' {
            return &s[0..i];
        }
    }
    
    &s[..]
}

fn main() {
    let s = "hello world";
    let word = first_word(s);
    println!("第一个单词: {}", word);
}

6.3 结构体方法 #

rust
struct Rectangle {
    width: u32,
    height: u32,
}

impl Rectangle {
    fn new(width: u32, height: u32) -> Self {
        Rectangle { width, height }
    }
    
    fn area(&self) -> u32 {
        self.width * self.height
    }
    
    fn scale(&mut self, factor: u32) {
        self.width *= factor;
        self.height *= factor;
    }
}

fn main() {
    let mut rect = Rectangle::new(10, 20);
    println!("面积: {}", rect.area());
    
    rect.scale(2);
    println!("缩放后面积: {}", rect.area());
}

七、总结 #

本章学习了:

  • 函数定义语法
  • 参数和返回值
  • 语句与表达式
  • 所有权与函数
  • 函数调用

下一章,我们将学习参数与返回值的更多细节。

最后更新:2026-03-27