Rust – Phương thức


Được đăng vào ngày 07/12/2017 | 0 bình luận

Nếu bạn đã học lập trình hướng đối tượng thì bạn sẽ biết đến khái niệm phương thức  method. Phương thức là các hàm được định nghĩa bên trong các lớp – class, và chỉ có các đối tượng được tạo ra từ lớp mới có thể gọi các hàm được.

Trong Rust thì chúng ta định nghĩa các phương thức cho các struct.

Giả sử chúng ta có đoạn code như sau:

struct blog {
    name: &’static str,
    publish: i32
}

fn main() {     
    let mut phocode: blog = blog{
        name: "phocode.com",
        publish: 2016
    };
println!("{:?} was launched in {}", phocode.name, phocode.publish);
}

Trong đoạn code trên chúng ta định nghĩa kiểu struct có tên blog với 2 phần tử là namepublish và tạo một biến với kiểu struct này có tên là phocode, sau đó chúng ta in một đoạn chuỗi giới thiệu về đối tượng này. Output như sau:

"phocode.com" was launched in 2016

Bây giờ thay vì gọi hàm println!() một cách tự do như thế, chúng ta có thể viết riêng cho lớp blog một phương thức để sử dụng, đoạn code như sau:

struct blog {    
name: &’static str,    
publish: i32
}
impl blog {    
fn selfIntroduce(&self) {        
println!("{:?} was launched in {}", self.name, &self.publish);    
}
}
fn main() {         
let mut phocode: blog = blog{        
name: "phocode.com",        
publish: 2016    
};      
phocode.selfIntroduce();
}

Đoạn code trên vẫn cho ra output như cũ, chỉ khác ở chỗ là bây giờ chúng ta gọi phương thức của struct có tên là selfIntroduce(), chứ không dùng hàm riêng lẻ nữa.

Theo như đoạn code trên thì để viết phương thức cho một struct thì chúng ta viết với cú pháp sau:

impl <tên_struct>

    fn <tên_phương_thức>() {

        ...

    }

}

Và khi gọi các phương thức thì chúng ta ghi tên của các biến tạo ra từ struct đó, rồi tới dấu chấm và tên phương thức.

Ngoài ra trong đoạn code ví dụ trên, chúng ta còn đưa vào phương thức tham số là &self, đây là biến tham chiếu tới biến đã gọi hàm đó, ở đây là biến phocode trong hàm main(), với self thì bạn có thể đọc dữ liệu từ các phần tử và có thể gọi các phương thức khác. Lưu ý khi khai báo có kí tự & nhưng khi sử dụng thì không có.

Khi gọi phương thức mà tham số là &self thì chúng ta không cần phải truyền cái gì vào khi gọi hàm, cứ để trống không là selfIntroduce().

Bây giờ chúng ta viết thêm một hàm như sau:

struct blog {    
name: &’static str,    
publish: i32
}
impl blog {    
fn selfIntroduce(&self) {        
println!("{:?} was launched in {}", self.name, &self.publish);    
}    
fn changeName(&mut self, newName: &’static str) {        
println!("Changing name from {:?} to {:?}", self.name, newName);        
self.name = newName;            
}
}
fn main() {         
let mut phocode: blog = blog{        
name: "phocode.com",        
publish: 2016    
};      
phocode.selfIntroduce();    
phocode.changeName("phocode.net");    
phocode.selfIntroduce();
}

Chúng ta viết thêm phương thức changeName() nhận vào một tham số là newName kiểu str để thay đổi giá trị của phần tử name. 

Lưu ý khi thay đổi giá trị của biến self thì chúng ta phải khai báo tham số là &mut self,  nếu không Rust sẽ báo lỗi. Khi truyền giá trị thì chúng ta chỉ cần truyền vào chuối là được.

"phocode.com" was launched in 2016
Changing name from "phocode.com" to "phocode.net"
"phocode.net" was launched in 2016

Lưu ý là Rust không hỗ trợ quá tải phương thức như trong các ngôn ngữ khác, tức là changeName(&mut self, newName: &'static str)changeName(&mut self) đểu không được phép tồn tại, chúng ta phải đặt tên khác nhau.

Được đăng vào ngày 07/12/2017