Method
Method adalah cara kita mendefinisikan behavior pada custom type.
Untuk mendefinisikan method, digukanakan keyword impl disertai Object yang akan diimplementasikan.
Sebagai contoh, kita dapat menambahkan method pada struct yang dibahas pada modul sebelumnya, yaitu HockeyPlayer. Syntax dasarnya akan seperti berikut
impl HockeyPlayer {
fn nama_method(self, param1: type1, ...) -> return_type{
//code goes here
}
}
Berikut contoh implementasi method dengan nama shot_puck, yang isi code akan menampilkan tulisan ‘Goal’
enum HockeyPosition { Center, Wing, Defense, Goalie, } struct HockeyPlayer { name: String, number: u8, position: HockeyPosition, goals_ytd: u8, } impl HockeyPlayer { fn shot_puck(self){ println!("Goal by {}", self.name); } } fn main() { let player = HockeyPlayer { name: String::from("Budi"), number: 44, position: HockeyPosition::Center, goals_ytd: 100 }; player.shot_puck(); }
Associated Function
Mirip dengan method, associated function didefnisikan dalam imp block, namun tidak menggunakan parameter self.
Associated function umumnya digunakan untuk membuat instance.
Berikut contoh penggunaan associated function new() pada struct HockeyPlayer.
enum HockeyPosition { Center, Wing, Defense, Goalie, } struct HockeyPlayer { name: String, number: u8, position: HockeyPosition, goals_ytd: u8, } impl HockeyPlayer { fn shot_puck(self){ println!("Goal by {}", self.name); } fn new(name:String, number:u8, position:HockeyPosition, goals_ytd:u8)-> HockeyPlayer{ HockeyPlayer{ name: name, number: number, position: position, goals_ytd: goals_ytd, } } } fn main() { //cara memanggil associated function let mut player = HockeyPlayer::new(String::from("Budi"), 44, HockeyPosition::Center, 4); //cara memanggil method player.shot_puck(); }
Method Read vs Write data
Method shot_puck diatas, bila kita jalankan lebih dari sekali akan terjadi error use of moved value : player
. Hal ini terjadi karena masalah ownership, kita akan bahas lebih mendalam di modul berikutnya.
Untuk mengatasi masalah diatas, kita dapat lakukan pendekatan borrow ownership, dengan menambahkan tanda & pada parameter self.
enum HockeyPosition { Center, Wing, Defense, Goalie, } struct HockeyPlayer { name: String, number: u8, position: HockeyPosition, goals_ytd: u8, } impl HockeyPlayer { //borrow ownership fn shot_puck(&self){ println!("Goal by {}", self.name); } fn new(name:String, number:u8, position:HockeyPosition, goals_ytd:u8)-> HockeyPlayer{ HockeyPlayer{ name: name, number: number, position: position, goals_ytd: goals_ytd, } } } fn main() { let mut player = HockeyPlayer::new(String::from("Budi"), 44, HockeyPosition::Center, 4); //method dapat dipanggil lebih dari satu kali karena sudah dilakukan borrow ownership player.shot_puck(); player.shot_puck(); }
Method diatas adalah Read method, yang artinya tidak ada melakukan perubahan data.
Jika ingin melakukan perubahan data, harus digunakan Write method dengan menambahkan keyword mut setelah tanda &.
Contohnya, kita ingin menambahkan nilai goals_ytd setiap fungsi shot_puck dipanggil.
enum HockeyPosition { Center, Wing, Defense, Goalie, } struct HockeyPlayer { name: String, number: u8, position: HockeyPosition, goals_ytd: u8, } impl HockeyPlayer { //tambahkan mut, untuk method write fn shot_puck(&mut self){ self.goals_ytd += 1; println!("Goal by {}, total goal: {}", self.name, self.goals_ytd); } fn new(name:String, number:u8, position:HockeyPosition, goals_ytd:u8)-> HockeyPlayer{ HockeyPlayer{ name: name, number: number, position: position, goals_ytd: goals_ytd, } } } fn main() { let mut player = HockeyPlayer::new(String::from("Budi"), 44, HockeyPosition::Center, 4); player.shot_puck(); player.shot_puck(); }
Sampai disini kita sudah memahami penggunaan method, associated function, cara membuat read dan write method.