Menu
CoddyTech

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 的方法是只读的。它们可以查看结构体的数据,但不能修改数据。在下一课中,你将学习如何创建可以修改实例的方法。

challenge icon

挑战

简单

创建一个 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 实例,并打印周长和直径
    
}
quiz icon自我测试

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

面向对象编程中的所有课

自己练习: Rust 在线编译器