self 参数
本课属于 Coddy Rust 学习旅程的“面向对象编程”单元。第 2 课,共 61 课。
当方法需要访问存储在结构体实例中的数据时,会使用 &self 参数。这个特殊参数始终是方法的第一个参数,表示调用该方法的实例的引用。
& 符号表示我们在借用这个实例,而不是获取它的所有权。这样,方法就可以读取结构体的字段,而不会消耗这个实例:
struct Rectangle {
width: u32,
height: u32,
}
impl Rectangle {
fn area(&self) -> u32 {
self.width * self.height
}
fn is_square(&self) -> bool {
self.width == self.height
}
}
在方法体中,self 让你可以使用点表示法访问结构体的所有字段。area 方法读取 width 和 height,计算并返回结果。
因为 &self 只会借用实例,所以你可以在同一个结构体上调用多个方法,不会有任何问题:
fn main() {
let rect = Rectangle { width: 10, height: 5 };
println!("Area: {}", rect.area()); // 50
println!("Square? {}", rect.is_square()); // false
}
使用 &self 的方法是只读的。它们可以查看结构体的数据,但不能修改数据。在下一课中,你将学习如何创建可以修改实例的方法。
挑战
简单创建一个 Circle 结构体,只包含一个字段:radius(f64)。
为 Circle 添加一个实现块,其中包含两个使用 &self 的方法:
circumference:以f64的形式返回圆的周长(公式:2.0 * 3.14159 * radius)diameter:以f64的形式返回圆的直径(公式:2.0 * radius)
你会收到一个输入:
- 圆的半径(f64)
使用给定的半径创建一个 Circle 实例,然后将周长和直径分别打印在单独的行上。
预期输出格式:
{circumference}
{diameter}亲手试试
use std::io;
// TODO: 在这里定义 Circle 结构体
// TODO: 为 Circle 添加实现块,包含计算周长和直径的方法
fn main() {
let mut input = String::new();
io::stdin().read_line(&mut input).expect("Failed to read line");
let radius: f64 = input.trim().parse().expect("Invalid number");
// TODO: 创建一个 Circle 实例,并打印周长和直径
}这节课包含一个小测验。开始学习即可作答,并记录你的进度。
面向对象编程中的所有课
自己练习: Rust 在线编译器