Sebenarnya ada apa dengan postingan ini? saya sedang belajar rust lang. Metode yang menurut saya efektif untuk belajar adalah menuliskannya di blog dan menjelaskan kembali hal tersebut. Saya amat sangat menerima kritik dan saran.
Pendahuluan
Sudah 1.5 minggu semenjak postingan terakhir saya tanggal 30 Agustus 2023 yang membahas mengenai Implementasi Struct Pada Program Kalkulasi Luas Bangun Datar. Lanjutan dari materi tersebut pada The Book by rust adalah method syntax.
Method syntax menggunakan fn seperti sebuah fungsi pada dasarnya. Kita dapat memanggilnya, melakukan return value, menambahkan parameter dan mengisinya dengan sebuah statement atau expression.
Perbedaanya adalah method syntax berasosiasi dengan struct, enum, atau trait dengan menggunakan syntax impl (implementation block). Selain itu, pada bagian parameter awalannya haruslah terdapat self sebagai representasi dari struct.
Method Syntax
#[derive(Debug)]
struct PersegiPanjang {
panjang: u32,
lebar: u32,
}
impl PersegiPanjang{
fn luas (&self) -> u32 {
self.panjang*self.lebar
}
}
fn main(){
let data = PersegiPanjang {
panjang: 50,
lebar: 25,
};
println!("Luas persegi panjang adalah {}", data.luas());
}Contoh 1.0
Pada contoh di atas impl PersegiPanjang mengarah pada struct PersegiPanjang. Kemdudian di dalamnya terdapat method luas yang berisi formula panjang*lebar. Parameter yang pertama didefiniikan adalah self.
self mengacu pada field struct PersegiPanjang yang telah dideklarasikan sebelumnya. self tersebut jika ditulis secara eksplisit menjadi self: &Self. Kita tidak perlu menggunakan persegipanjang: PersegiPanjang sebagai parameter di atas karena sesuatu yang berada sesudah impl secara otomatis akan berasosiasi pada struct.
Pemanggilan method syntax menggunakan titik “.” dan didahului dengan struct yang telah didefinisikan pada suatu variabel, contohnya data.luas(). Artinya untuk menghitung luas, &self tersebut mengacu pada variabl data.
Nama Method yang Sama Dengan Field Struct
#[derive(Debug)]
struct PersegiPanjang {
panjang: u32,
lebar: u32,
}
impl PersegiPanjang{
fn panjang (&self) -> bool {
self.panjang > 0
}
}
fn main(){
let data = PersegiPanjang {
panjang: 50,
lebar: 25,
};
if data.panjang() {
println!("Panjang dari persegi panjang tidak sama dengan 0 -> {}", data.panjang());
}
}Contoh 1.1
Perhatikan bahwa nama method panjang sama dengan nama field struct. Hal itu tidak menjadi masalah. Rust secara otomatis mendeteksi method ketika terdapat “()“, artinya mengarah pada field struct PersegiPanjang contohnya data.panjang().
Program di atas akan mengembalikan sebuah bool berdasarkan field panjang pada struct. Jika x > 0 bernilai true dan x < 0 false. Perhatikan output contoh 1.1.
Panjang dari persegi panjang tidak sama dengan 0 -> trueContoh 1.2
Method Dengan Banyak Parameter
Terdapat permasalahan dimana Alex akan memasukan terpal pada bagasi mobil berbentuk persegi panjang. Terpal itu juga dirapihkan terlebih dahulu sehingga bentuknya sama dengan bagasi.
Untuk mengecek masuk atau tidaknya terpal, kita dapat mebandingkan komponen panjang dan lebar antara bagasi dan terpal. Jika panjang bagasi > panjang terpal dan lebar bagasi > lebar terpal maka terpal itu dapat disimpan pada bagasi mobil.
#[derive(Debug)]
struct DataBenda {
panjang: u32,
lebar: u32,
}
impl DataBenda {
fn luas (&self) -> u32 {
self.panjang * self.lebar
}
fn memuat (&self, other: &DataBenda) -> bool {
self.panjang > other.panjang && self.lebar > other.lebar
}
}
fn main () {
let bagasi = DataBenda {
panjang: 90,
lebar: 35,
};
let terpal = DataBenda {
panjang: 60,
lebar: 15,
};
println!("Luas dari bagasi mobil {} cm2 dan luas terpal {} cm2", bagasi.luas(), terpal.luas() );
println!("Bagasi tersebut dapat menampung terpal -> {}.", bagasi.memuat(&terpal));
}Contoh 1.3
Contoh 1.3 memiliki dua method dalam satu impl DataBenda, yaitu luas berisi perhitungan yang memiliki dua parameter utama berupa &self dan other: &DataBenda. Selanjutnya method memuat yang mengembalikan bool karena isinya membandingkan komponen panjang serta lebar dari terpal dan bagasi.
Setelah itu kita menggunakan syntax bagasi.memuat(&terpal). Perintah ini akan meminjam data dari terpal kemudian melakukan operasi yang diperlukan pada method memuat. Kita juga dapat membuat dua impl dari contoh 1.3 menjadi:
impl DataBenda {
fn luas (&self) -> u32 {
self.panjang * self.lebar
}
}
impl DataBenda {
fn memuat (&self, other: &DataBenda) -> bool {
self.panjang > other.panjang && self.lebar > other.lebar
}
}Contoh 1.4
Output dari contoh 1.3 dan contoh 1.4 adalah sebagai berikut.
Luas dari bagasi mobil 3150 cm2 dan luas terpal 900 cm2
Bagasi tersebut dapat menampung terpal -> true.Contoh 1.5
Associatied Function Tanpa Parameter
Associatied function adalah fungsi yang dideklarasikan dalam impl. Kita dapat membuat fungsi jenis ini tanpa memiliki parameter self yang biasanya digunakan sebgai konstruktor (bukan method) untuk menambahkan nilai field struct.
Fungsi ini tidak membutuhkan struct untuk berjalan. Pada materi sebelumya mengenai slice kita telah banyak menggunakan String::from. Oleh karena itu, untuk membuat fungsi yang tidak memiliki paramter self saat ingin memanggilnya menggunakan ::.
#[derive(Debug)]
struct PersegiPanjang {
panjang: u32,
lebar: u32,
}
impl PersegiPanjang {
fn input (data: u32) -> Self{
Self {
panjang: data,
lebar: data,
}
}
}
fn main() {
let persegi_panjang = PersegiPanjang::input(4);
println!("Panjang {} cm dan lebar {} cm", persegi_panjang.panjang, persegi_panjang.lebar );
}Contoh 1.6
Self mengacu pada struct PersegiPanjang sehingga nilai yang didapatkan dari parameter data akan masuk ke dalam struct PersegiPanjang setelah dilakukan pengembalian nilai.
PersegiPanjang::input(4) digunakan agar angka 4 masuk pada fungsi input. Saat melakukan pemanggilan persegi_panjang.panjang dan persegi_panjang.lebar. Output yang dihasilkan adalah sebagai berikut.
Panjang 4 cm dan lebar 4 cmContoh 1.7
Penutup
Method syntax berhubungan dengan struct yang telah dideklarasikan sebelumnya, terdapat di dalam impl. Selain itu kita dapat menggunakan associatied function tanpa parameter yang bukan termasuk method syntax tetapi sangat berguna sebagai sebuah kontruktor.
Gambar yang dibuat sebagai cover postingan ini adalah hasil dari Dream Studio.
One response to “Mengenal Method Syntax dan Fungsinya pada Rust”
[…] sudah mencoba mempelajari bahasa ini sejak 2023 tapi ternyata tidak semudah itu. Mulai dari pasang surut motivasi dan keinginan untuk berpindah […]
LikeLike