Menu
CoddyTech

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)!

challenge icon

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 Book mới với tiêu đề đã cho và pages được đặt thành 0

Đồ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} pages

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