Hàm liên kết
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 4 trên 61.
Không phải hàm nào trong khối impl cũng cần hoạt động trên một instance có sẵn. Các hàm không nhận self làm tham số được gọi là hàm liên kết: chúng gắn với chính kiểu dữ liệu đó, chứ không gắn với một instance cụ thể nào.
Cách dùng phổ biến nhất của các hàm liên kết là tạo hàm khởi tạo. Theo quy ước, chúng thường có tên là new:
struct Player {
name: String,
score: u32,
}
impl Player {
fn new(name: String) -> Player {
Player {
name,
score: 0,
}
}
}
Lưu ý rằng không có tham số self. Hàm này không cần một Player có sẵn để hoạt động. Thay vào đó, hàm tạo và trả về một đối tượng mới hoàn toàn. Kiểu trả về là chính struct đó.
Để gọi một hàm liên kết, hãy dùng cú pháp :: với tên kiểu thay vì ký hiệu dấu chấm:
fn main() {
let player1 = Player::new(String::from("Alice"));
println!("{} starts with {} points", player1.name, player1.score);
// Đầu ra: Alice starts with 0 points
}
Mẫu này giúp khởi tạo các struct với giá trị mặc định hoặc logic kiểm tra hợp lệ một cách gọn gàng, đồng thời gom logic tạo vào phần định nghĩa kiểu. Có lẽ bạn đã thấy cú pháp này trong String::from(): đó cũng là một hàm liên kết (associated function)!
Thử thách
DễTạo một struct Book với hai trường: title (String) và pages (u32).
Thêm một khối triển khai cho Book với hàm liên kết có tên new, hàm này:
- Nhận tham số
title: String - Trả về một
Bookmới với tiêu đề đã cho vàpagesđược đặt thành0
Đồng thời, thêm một phương thức có tên info, nhận &self và trả về một String theo định dạng: "{title} has {pages} pages"
Bạn sẽ nhận được một đầu vào:
- Tiêu đề của cuốn sách (String)
Dùng hàm liên kết Book::new để tạo một cuốn sách với tiêu đề đã cho, sau đó in kết quả gọi phương thức info.
Định dạng đầu ra dự kiến:
{title} has {pages} pagesTự làm thử
use std::io;
// TODO: Định nghĩa struct Book với các trường title (String) và pages (u32)
// TODO: Thêm khối impl cho Book gồm:
// - Hàm liên kết (associated function) `new` nhận title và trả về một Book có pages bằng 0
// - Phương thức (method) `info` trả về một String theo định dạng "{title} has {pages} pages"
fn main() {
let mut input = String::new();
io::stdin().read_line(&mut input).expect("Failed to read line");
let title = input.trim().to_string();
// TODO: Dùng Book::new để tạo một cuốn sách với title đã cho
// TODO: In ra kết quả khi gọi phương thức info
}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