Menu
CoddyTech

Tham số self

Thuộc phần Lập trình hướng đối tượng trong hành trình Rust của Coddy. Bài học 2 trên 61.

Khi một phương thức cần truy cập dữ liệu được lưu trong một thực thể struct, nó dùng tham số &self. Tham số đặc biệt này luôn là đối số đầu tiên trong một phương thức và đại diện cho một tham chiếu đến thực thể mà phương thức được gọi trên đó.

Ký hiệu & có nghĩa là chúng ta đang mượn đối tượng thay vì nhận quyền sở hữu đối tượng đó. Nhờ vậy, phương thức có thể đọc các trường của struct mà không tiêu thụ đối tượng:

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
    }
}

Bên trong thân phương thức, self cho phép bạn truy cập tất cả các trường của struct bằng ký pháp dấu chấm. Phương thức area đọc cả width và height để tính toán và trả về kết quả.

Vì &self chỉ mượn đối tượng, bạn có thể gọi nhiều phương thức trên cùng một struct mà không gặp vấn đề gì:

fn main() {
    let rect = Rectangle { width: 10, height: 5 };
    
    println!("Area: {}", rect.area());      // 50
    println!("Square? {}", rect.is_square()); // false
}

Các phương thức dùng &self chỉ đọc dữ liệu. Chúng có thể xem dữ liệu của struct nhưng không thể thay đổi dữ liệu đó. Trong bài học tiếp theo, bạn sẽ học cách tạo phương thức có thể sửa đổi instance.

challenge icon

Thử thách

Dễ

Tạo một struct Circle với một trường duy nhất: radius (f64).

Thêm khối triển khai cho Circle với hai phương thức sử dụng &self:

  • circumference: trả về chu vi dưới dạng f64 (công thức: 2.0 * 3.14159 * radius)
  • diameter: trả về đường kính dưới dạng f64 (công thức: 2.0 * radius)

Bạn sẽ nhận được một đầu vào:

  • Bán kính của hình tròn (f64)

Tạo một instance Circle với bán kính đã cho, sau đó in chu vi và đường kính trên các dòng riêng biệt.

Định dạng đầu ra dự kiến:

{circumference}
{diameter}

Tự làm thử

use std::io;

// TODO: Định nghĩa struct Circle tại đây


// TODO: Thêm khối triển khai cho Circle với các phương thức (method) tính chu vi và đường kính


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: Tạo một instance của Circle và in ra chu vi cùng đường kính
    
}
quiz iconTự kiểm tra

Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.

Tất cả bài học trong Lập trình hướng đối tượng

Tự luyện tập: Trình biên dịch Rust online