Menu
CoddyTech

可变方法

本课属于 Coddy Rust 学习旅程的“面向对象编程”单元。第 3 课,共 61 课。

有时,方法不只是读取数据,还需要修改数据。要创建能够修改结构体字段的方法,我们使用 &mut self,而不是 &self。

mut 关键字表示可变借用,允许方法修改实例的内部状态:

struct Counter {
    value: i32,
}

impl Counter {
    fn increment(&mut self) {
        self.value += 1;
    }
    
    fn decrement(&mut self) {
        self.value -= 1;
    }
    
    fn get(&self) -> i32 {
        self.value
    }
}

注意,increment 和 decrement 使用 &mut self,因为它们会修改 value;而 get 使用 &self,因为它只读取数据。

调用可变方法时,实例本身必须声明为可变:

fn main() {
    let mut counter = Counter { value: 0 };
    
    counter.increment();
    counter.increment();
    println!("{}", counter.get()); // 2
    
    counter.decrement();
    println!("{}", counter.get()); // 1
}

如果创建实例时忘记了 mut 关键字,Rust 就会阻止你对它调用任何 &mut self 方法。这样可以确保你始终知道数据何时可能发生变化。

challenge icon

挑战

简单

创建一个只有一个字段 balance(i32)的 BankAccount 结构体。

为 BankAccount 添加一个实现块,其中包含三个方法:

  • deposit:接收 &mut self 和一个 amount: i32,将该金额加到余额中
  • withdraw:接收 &mut self 和一个 amount: i32,从余额中减去该金额
  • get_balance:接收 &self,并将当前余额作为 i32 返回

你会收到三个输入:

  • 第一行:初始余额(i32)
  • 第二行:存款金额(i32)
  • 第三行:取款金额(i32)

使用初始余额创建一个可变的 BankAccount 实例,然后存入给定金额,取出给定金额,并打印最终余额。

预期输出格式:

{final_balance}

亲手试试

use std::io;

// TODO: 在这里定义 BankAccount 结构体


// TODO: 为 BankAccount 添加实现块,包含 deposit、withdraw 和 get_balance 方法


fn main() {
    let mut input = String::new();
    
    // 读取初始余额
    io::stdin().read_line(&mut input).expect("Failed to read line");
    let initial_balance: i32 = input.trim().parse().expect("Invalid number");
    
    input.clear();
    
    // 读取存款金额
    io::stdin().read_line(&mut input).expect("Failed to read line");
    let deposit_amount: i32 = input.trim().parse().expect("Invalid number");
    
    input.clear();
    
    // 读取取款金额
    io::stdin().read_line(&mut input).expect("Failed to read line");
    let withdraw_amount: i32 = input.trim().parse().expect("Invalid number");
    
    // TODO: 使用 initial_balance 创建可变的 BankAccount 实例
    // TODO: 使用 deposit_amount 调用 deposit
    // TODO: 使用 withdraw_amount 调用 withdraw
    // TODO: 使用 get_balance 输出最终余额
}
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

面向对象编程中的所有课

自己练习: Rust 在线编译器