可变方法
本课属于 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 方法。这样可以确保你始终知道数据何时可能发生变化。
挑战
简单创建一个只有一个字段 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 输出最终余额
}这节课包含一个小测验。开始学习即可作答,并记录你的进度。
面向对象编程中的所有课
自己练习: Rust 在线编译器