You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: docs/basic/traits.md
+94-8Lines changed: 94 additions & 8 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -33,15 +33,99 @@ Berdasarkan tempat dimana traits dibuat, ada 2 jenis traits:
33
33
34
34
-**External traits** (atau foreign traits).
35
35
36
-
Yaitu traits yang tempat dideklarasikannya berada di luar create kode yang ditulis. Misalnya, trait `std::fmt::Debug` dan `std::ops::Add`, keduanya merupakan external traits yang berada di crate `std` atau crate Rust Standard Library.
36
+
Yaitu traits yang tempat dideklarasikannya berada di luar crate kode yang ditulis. Misalnya, trait `std::fmt::Debug` dan `std::ops::Add`, keduanya merupakan external traits yang berada di crate `std` atau crate Rust Standard Library.
37
37
38
-
Pada case yang berhubungan dengan external traits, kita programmer umumnya hanya fokus ke implementasi saya, bagaimana cara memanfaatkan dan menggunakan external traits yang sudah ada ke dalam kode yang ditulis.
38
+
Pada kasus seperti ini, kita biasanya hanya fokus ke cara memakai external traits yang sudah ada.
39
39
40
40
-**Local traits**.
41
41
42
42
Adalah traits yang kita ciptakan di crate yang berada di dalam package/project yang sedang kita kerjakan.
43
43
44
-
Chapter ini fokusnya adalah pembahasan tentang dasar implementasi **external traits** dan cara kerjanya.
44
+
Chapter ini fokusnya adalah pembahasan tentang dasar implementasi **external traits** dan cara kerjanya. Setelah itu, kita juga akan lihat sedikit contoh `local trait` supaya bedanya lebih terasa.
45
+
46
+
### ◉ Aturan penting dalam implementasi trait
47
+
48
+
Di Rust ada aturan yang perlu diingat:
49
+
50
+
-`external trait` boleh diimplementasikan ke `local type`
51
+
-`local trait` boleh diimplementasikan ke tipe apa pun
52
+
-`external trait` tidak boleh diimplementasikan ke `external type`
53
+
54
+
Aturan ini biasanya disebut *orphan rule* atau *coherence rule*.
55
+
56
+
Kalau dibahas dengan bahasa sederhana, Rust ingin mencegah dua crate berbeda saling berebut implementasi untuk trait dan type yang sama. Dengan begitu, perilaku program tetap jelas dan tidak ambigu.
57
+
58
+
Kalau kita tetap ingin memakai `external trait` pada `external type`, solusinya adalah memakai *wrapper pattern*. Caranya, kita bungkus type external tersebut ke type local buatan kita sendiri, lalu implementasikan trait ke wrapper itu.
Sekarang kita coba kebalikannya: membuat trait sendiri, lalu mengimplementasikannya ke type yang sudah ada.
96
+
97
+
Misalnya kita punya trait sederhana bernama `Message`:
98
+
99
+
```rust
100
+
traitMessage {
101
+
fnlog(&self);
102
+
}
103
+
```
104
+
105
+
Lalu kita implementasikan ke `String`:
106
+
107
+
```rust
108
+
implMessageforString {
109
+
fnlog(&self) {
110
+
println!("{}", self);
111
+
}
112
+
}
113
+
```
114
+
115
+
Karena `Message` adalah `local trait`, kita boleh mengimplementasikannya ke type `String` yang berasal dari standard library.
116
+
117
+
Pemakaiannya di `main` akan terlihat seperti ini:
118
+
119
+
```rust
120
+
fnmain() {
121
+
lets=String::from("hello");
122
+
s.log();
123
+
}
124
+
```
125
+
126
+
Output:
127
+
128
+
> hello
45
129
46
130
## A.36.2. Implementasi trait
47
131
@@ -82,7 +166,7 @@ struct Circle {
82
166
83
167
Hasilnya error, karena struct `Circle` yang dibuat tidak implement trait `std::fmt::Debug`.
84
168
85
-
Solusi agar tidak error adalah dengan mengimplementasikan trait `std::fmt::Debug` ke tipe `Circle`, dengan itu semua data bertipe `Circle` akan bisa di-print menggunakan formatted print `{:?}`.
169
+
Solusi agar tidak error adalah dengan mengimplementasikan trait `std::fmt::Debug` ke tipe `Circle`, dengan begitu semua data bertipe `Circle` akan bisa di-print menggunakan formatted print `{:?}`.
86
170
87
171
> Selain via implementasi trait, tipe data custom bisa di-print dengan cara menambahkan atribut `#[derive(Debug)]` pada definisi tipe data-nya. Namun kita tidak membahas itu pada chapter ini.
88
172
@@ -100,7 +184,7 @@ pub trait Debug {
100
184
101
185
Trait `Debug` mempunyai satu spesifikasi method, bernama `fmt` yang detail strukturnya bisa dilihat di atas.
102
186
103
-
Kita akan implement trait `Debug` ini ke tipe `Circle`, maka wajib hukumnya untuk menuliskan implementasi method sesuai dengan yang ada di trait `Debug`.
187
+
Kita akan implement trait `Debug` ini ke tipe `Circle`, maka wajib untuk menuliskan implementasi method sesuai dengan yang ada di trait `Debug`.
104
188
105
189
Di bawah ini adalah contoh cara implementasi trait.
106
190
@@ -157,7 +241,7 @@ impl std::fmt::Debug for Circle {
157
241
}
158
242
```
159
243
160
-
Kemudian tulis implementasi method `fmt` dalam block method. Tulis statement macro `write` untuk data string (yang ingin di-print) dengan tujuan adalah variabel `f`.
244
+
Kemudian tulis implementasi method `fmt` dalam block method. Di sini kita memakai macro `write` untuk menulis data string yang ingin di-print ke variabel `f`.
161
245
162
246
Di contoh, format `Circle radius: {}` digunakan. Dengan ini nantinya saat printing data, yang muncul adalah text `Circle radius: {}`.
163
247
@@ -169,7 +253,7 @@ impl std::fmt::Debug for Circle {
169
253
}
170
254
```
171
255
172
-
> Tips untuk pengguna visual studio code dengan rust-analyzer extension ter-install, setelah selesai menulis block kode `impl`, cukup jalankan `ctrl+space` atau `cmd+space` untuk men-trigger autocomplete suggestion. Kemudian klik opsi method yang ada di situ, maka kode implementasi method langsung muncul dengan sendirinya.
256
+
> Tips untuk pengguna visual studio code dengan rust-analyzer extension ter-install: setelah selesai menulis block kode `impl`, cukup jalankan `ctrl+space` atau `cmd+space` untuk men-trigger autocomplete suggestion. Kemudian klik opsi method yang ada di situ, maka kode implementasi method langsung muncul dengan sendirinya.
173
257
174
258
### ◉ Macro `write`
175
259
@@ -195,7 +279,7 @@ Coba tambahkan statement `println`, tetapi kali ini gunakan formatted print `{}`
195
279
196
280

197
281
198
-
Hasilnya error, karena trait `std::fmt::Debug` hanya berguna untuk formatted print `{:?}`. Agar data bertipe `Circle` bisa di-print menggunakan formatted print `{}` maka trait `std::fmt::Display` harus diimplementasikan juga.
282
+
Hasilnya error, karena trait `std::fmt::Debug` hanya berguna untuk formatted print `{:?}`. Kalau ingin `Circle` bisa di-print dengan `{}`, maka trait `std::fmt::Display`juga harus diimplementasikan.
199
283
200
284
Ubah kode dengan menambahkan implementasi trait `Display`. Hasilnya kurang lebih seperti ini:
201
285
@@ -220,6 +304,8 @@ impl std::fmt::Display for Circle {
220
304
> - Link dokumentasi trait `Debug`https://doc.rust-lang.org/std/fmt/trait.Debug.html
221
305
> - Link dokumentasi trait `Display`https://doc.rust-lang.org/std/fmt/trait.Display.html
222
306
307
+
> Lebih detail tentang trait bound, wrapper pattern, dan aturan implementasi trait untuk type lokal maupun external ada di chapter [Traits ➜ Advanced](/basic/advanced-traits).
0 commit comments