Chuyển đến nội dung chính
Mô-đun 4 · Bài học 2 trong tổng số 28/14 trong khóa học~12 min
Bài học theo mô-đun (2/2)

Phương thức và khối impl

Trong Rust, các phương thức tương tự như hàm, nhưng chúng được xác định trong ngữ cảnh của cấu trúc (hoặc enum hoặc đặc điểm) và tham số đầu tiên của chúng luôn là self, đại diện cho phiên bản của cấu trúc mà phương thức đang được gọi.

Xác định phương thức với impl

Để xác định các phương thức trên một cấu trúc, chúng tôi sử dụng khối impl (triển khai) với tên của cấu trúc:

Rust
struct Rectangle {
    width: u32,
    height: u32,
}

impl Rectangle {
    // This is an instance method. It takes &self for reading.
    fn area(&self) -> u32 {
        self.width * self.height
    }
}

fn main() {
    let rect = Rectangle { width: 30, height: 50 };

    // Call the method using dot notation
    println!("The area is: {}", rect.area());
}

Các hàm liên kết (tĩnh)

Các hàm được xác định trong khối impl không chấp nhận self làm tham số đầu tiên của chúng được gọi là hàm liên kết (tương đương với các phương thức tĩnh trong các ngôn ngữ khác).

Chúng thường được sử dụng làm hàm tạo để trả về các phiên bản mới của cấu trúc. Để gọi chúng, hãy sử dụng cú pháp dấu hai chấm :::

Rust
impl Rectangle {
    // Associated function
    fn square(size: u32) -> Rectangle {
        Rectangle {
            width: size,
            height: size,
        }
    }
}

fn main() {
    // Call the associated function
    let sq = Rectangle::square(10);
}

Các phương thức sửa đổi trạng thái: &mut self

Nếu một phương thức cần sửa đổi các trường của cấu trúc thì nó phải khai báo tham số đầu tiên là &mut self. Bản thân phiên bản mà phương thức được gọi phải được khai báo là có thể thay đổi (let mut):

Rust
impl Rectangle {
    fn double_size(&mut self) {
        self.width *= 2;
        self.height *= 2;
    }
}

Hãy tự mình thử

tập thể dục#rust.m4.l2.e1
Nỗ lực: 0Đang tải…

Hoàn thành khối impl bằng cách xác định phương thức vùng lấy &self và trả về u32 (nhân chiều rộng và chiều cao).

Đang tải trình chỉnh sửa…
Hiển thị gợi ý

Viết `fn Area(&self) -> u32 { self.width \* self.height }`bên trong khối`impl Rectangle`.

Giải pháp khả dụng sau 3 lần thử

tập thể dục#rust.m4.l2.e2
Nỗ lực: 0Đang tải…

Xác định hàm liên kết hình vuông bên trong impl Rectangle, hàm này nhận kích thước: u32 và trả về một phiên bản Hình chữ nhật có chiều rộng và chiều cao bằng kích thước.

Đang tải trình chỉnh sửa…
Hiển thị gợi ý

Viết `fn hình vuông(size: u32) -> Hình chữ nhật { Hình chữ nhật { width: size, Height: size } }`bên trong khối`impl`.

Giải pháp khả dụng sau 3 lần thử

tập thể dục#rust.m4.l2.e3
Nỗ lực: 0Đang tải…

Thêm phương thức biến đổi tỷ lệ vào Hình chữ nhật bên trong khối impl. Phương thức tỷ lệ phải lấy tham chiếu có thể thay đổi cho tham số self (&mut self) và tham số hệ số: u32, đồng thời nhân cả chiều rộng và chiều cao của Hình chữ nhật với hệ số.

Đang tải trình chỉnh sửa…
Hiển thị gợi ý

Triển khai `fn thang đo (&mut self, hệ số: u32)`để cập nhật`self.width`và`self.height`bằng cách nhân chúng với`hệ số`.

Giải pháp khả dụng sau 3 lần thử