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.
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ạngf64(công thức:2.0 * 3.14159 * radius)diameter: trả về đường kính dưới dạngf64(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
}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
1Phương thức và hành vi
Nhập môn khối triển khaiTham số selfPhương thức có thể thay đổiHàm liên kếtNhiều khối triển khaiNối chuỗi phương thứcÔn tập: thao tác với hình chữ nhật4Dự án: Thú cưng ảo
Định nghĩa thú cưngCho thú cưng ăn7Các trait tiêu chuẩn
Trait DebugTrait DisplayClone và CopyCác trait so sánh bằngÔn tập: Điểm có thể in ra2Tính đóng gói và module
Kiến thức cơ bản về moduleTừ khóa publicTrường riêng tưHàm lấy giá trịHàm thiết lập giá trịÔn tập: tủ khóa an toàn5Kiểu tổng quát
Cấu trúc tổng quátPhương thức tổng quátNhiều kiểu tổng quátHàm tổng quátÔn tập: điểm tọa độTự luyện tập: Trình biên dịch Rust online