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
Manfaat penerapan trait sebagai tipe data parameter fungsi adalah saat pemanggilan fungsi, parameter tersebut bisa diisi dengan argument data bertipe apapun dengan catatan tipe dari data tersebut mengimplementasikan trait yang sama dengan yang digunakan pada parameter.
145
+
Manfaat penerapan trait sebagai tipe data parameter fungsi adalah saat pemanggilan fungsi, parameter tersebut bisa diisi dengan argument data bertipe apa pun dengan catatan tipe dari data tersebut mengimplementasikan trait yang sama dengan yang digunakan pada parameter.
146
146
147
147
Contohnya seperti pada fungsi `calculate_and_print_result` di atas yang parameter ke-2 bertipe `&impl Area`, nantinya saat fungsi tersebut dipanggil, kita bisa sisipi parameter ke-2 dengan object `circle_one` ataupun `circle_two`.
148
148
@@ -211,7 +211,7 @@ Mari praktikkan. Lakukan modifikasi berikut pada beberapa kode yang telah di tul
Copy file name to clipboardExpand all lines: docs/basic/array.md
+3-1Lines changed: 3 additions & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -306,12 +306,14 @@ for sub_arr in data_arr {
306
306
println!();
307
307
}
308
308
309
+
// output ⬇️
310
+
//
309
311
// salad, fried rice,
310
312
// apple, coconut,
311
313
// spinach, jalapeno,
312
314
```
313
315
314
-
Variabel `data_arr` pada contoh di atas bertipe data`[[&str; 2]; 3]`, yang artinya adalah sebuah array dengan size 3, dengan isi elemen adalah juga array dengan size 2. Selalu ingat bahwa size array adalah fixed.
316
+
Variabel `data_arr` pada contoh di atas bertipe data`[[&str; 2]; 3]`, yang artinya adalah sebuah array dengan size 3, dengan isi elemen adalah juga array dengan size 2. Selalu ingat bahwa size array adalah fixed.
@@ -216,7 +216,7 @@ Struct adalah salah satu dari beberapa item yang ada di Rust. Struct bisa saja b
216
216
217
217
Sekarang, kode yang sudah dipraktikkan di atas akan kita refactor. Struct `LegoSet` beserta associated items-nya dipindah ke module file bernama `lego`, dengan itu maka pemanggilan struct tersebut harus menggunakan path `lego::LegoSet`.
218
218
219
-
Kurang lebih struktur package mendi seperti ini:
219
+
Kurang lebih struktur package menjadi seperti ini:
Copy file name to clipboardExpand all lines: docs/basic/attributes.md
+2-2Lines changed: 2 additions & 2 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -482,7 +482,7 @@ Pada contoh di atas, tempat di mana enum dideklarasikan dan digunakan adalah mas
482
482
483
483
## A.51.6. Attribute *modules*
484
484
485
-
Aturan manajemen di Rust cukup ketat, dan sudah dibahas secara mendetal pada chapter [Module System ➜ Module](/basic/module-basic), yang intinya adalah ada dua cara pembuatan module:
485
+
Aturan manajemen di Rust cukup ketat, dan sudah dibahas secara mendetail pada chapter [Module System ➜ Module](/basic/module-basic), yang intinya adalah ada dua cara pembuatan module:
486
486
487
487
- Cara ke-1: dengan mendefinisikan module pada file bernama `nama_module.rs`
488
488
- Cara ke-2: dengan mendefinisikan module pada file bernama `nama_module/mod.rs`
@@ -548,7 +548,7 @@ Lebih detailnya mengenai attribute testing dibahas pada chapter [Testing](#/wip/
548
548
549
549
Lebih detailnya mengenai attribute macros dibahas pada chapter [Macro](#/wip/macro).
550
550
551
-
## A.51.9 Attribute lainnya
551
+
## A.51.9. Attribute lainnya
552
552
553
553
Rust memiliki cukup banyak attribute yang list-nya bisa dilihat pada link ini https://doc.rust-lang.org/reference/attributes.html.
Copy file name to clipboardExpand all lines: docs/basic/basic-memory-management.md
+4-4Lines changed: 4 additions & 4 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -20,15 +20,15 @@ GC adalah metode manajemen memori otomatis pada bahasa pemrograman. GC memiliki
20
20
21
21
Proses dealokasi pada GC terjadi di belakang layar secara asynchronous.
22
22
23
-
Beberapa bahasa pemrograman yang menerapkan GC di antara adalah Java, C#, Go, Lisp, dan banyak bahasa lainnya.
23
+
Beberapa bahasa pemrograman yang menerapkan GC di antaranya adalah Java, C#, Go, Lisp, dan banyak bahasa lainnya.
24
24
25
25
### ◉ Automatic reference counting (ARC)
26
26
27
-
ARC adalah metode manajemen memori yang diterapkan pada bahasa Objective-C dan Swift. Cara ARC me-manage memory adalah dengan mencatat *reference* object dan segala aktifitas yang terjadi pada object tersebut.
27
+
ARC adalah metode manajemen memori yang diterapkan pada bahasa Objective-C dan Swift. Cara ARC me-manage memory adalah dengan mencatat *reference* object dan segala aktivitas yang terjadi pada object tersebut.
28
28
29
29
Di ARC, ada satuan yang disebut dengan *retain count* yang merupakan representasi jumlah banyaknya variabel atau object yang memegang suatu *reference*. Ketika *reference* sudah pindah ke luar scope atau dihapus isinya dan dilihat pada catatan rupanya tidak ada variabel yang memegang *reference* tersebut, maka dilakukan proses dealokasi memory.
30
30
31
-
Dalam bahasa yang menerapkan ARC, programmer dianjurkan untuk perhatian dan bijak dalam pengalokasian variabel beserta nilainya. Mana data yang diperlukan untuk di-retain secara *strong* dan mana yang tidak, harus pas sesuai dengan kebutuhan. Jika tidak hati-hati maka program mempunyai resiko lebih tinggi untuk menemui error *deadlocks* ataupun *memory leaks* (yang juga akan dibahas pada chapter ini).
31
+
Dalam bahasa yang menerapkan ARC, programmer dianjurkan untuk berhati-hati dan bijak dalam pengalokasian variabel beserta nilainya. Mana data yang diperlukan untuk di-retain secara *strong* dan mana yang tidak, harus pas sesuai dengan kebutuhan. Jika tidak hati-hati maka program mempunyai resiko lebih tinggi untuk menemui error *deadlock* ataupun *memory leaks* (yang juga akan dibahas pada chapter ini).
32
32
33
33
### ◉ Manual memory management
34
34
@@ -169,7 +169,7 @@ Ok, lanjut ke block fungsi `main` berikutnya, yaitu `let a = 4`. Saat dipanggil
Copy file name to clipboardExpand all lines: docs/basic/block-expression.md
+9-7Lines changed: 9 additions & 7 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -45,14 +45,16 @@ Kemudian ada beberapa variabel baru yang didefinisikan di dalam block, yaitu `y`
45
45
Sebagai contoh, kode berikut menghasilkan error:
46
46
47
47
```rust
48
-
letx=24;
48
+
fnmain() {
49
+
letx=24;
49
50
50
-
{
51
-
lety=12;
52
-
letz=x+y;
53
-
};
51
+
{
52
+
lety=12;
53
+
letz=x+y;
54
+
};
54
55
55
-
println!("z: {}", z); // <------ error
56
+
println!("z: {}", z); // <------ error
57
+
}
56
58
```
57
59
58
60
O iya, dalam penulisannya, statement block harus diikuti tanda semicolon `;` sebagai penanda akhir statement, dengan beberapa pengecualian yang akan ikut dibahas pada section setelah ini.
@@ -164,7 +166,7 @@ Pembahasan mengenai unsafe block expression ada pada chapter [Safe & Unsafe](#/w
164
166
165
167
Block biasa diterapkan untuk isolasi sebuah proses yang tidak perlu di-reuse. Jika proses adalah di-reuse, dianjurkan untuk menggunakan fungsi dalam penerapannya.
166
168
167
-
Di bahasa pemrograman lain juga ada block yang penerapannya kurang lebih adalah sama. Namun perlu diketahui, di Rust block memiliki berbedaan yang bisa dibilang signifikan, yaitu dalam hal manajemen memory.
169
+
Di bahasa pemrograman lain juga ada block yang penerapannya kurang lebih adalah sama. Namun perlu diketahui, di Rust block memiliki perbedaan yang bisa dibilang signifikan, yaitu dalam hal manajemen memory.
168
170
169
171
Rust menerapkan konsep memory management bernama **ownership**. Setiap kali Rust selesai mengeksekusi block kode, baik itu fungsi, block expression, atau jenis block lainnya; akan dilakukan evaluasi pengecekan ownership yang ada dalam block tersebut. Untuk data yang owner-nya tidak berpindah ke luar scope, maka akan dilakukan proses dealokasi memory untuk data tersebut. Dengan approach ini penggunaan memory menjadi efisien.
Copy file name to clipboardExpand all lines: docs/basic/borrowing.md
+1-1Lines changed: 1 addition & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -307,7 +307,7 @@ let d = &false;
307
307
lete=&String::from("rust");
308
308
```
309
309
310
-
Ketiga variabel, semuanya adalah *borrower* atau peminjam data. Lalu siapa *owner*-nya? jawabannya adalah tidak ada, atau silakan juga simpulkan bawah data tersebut owner-nya adalah program.
310
+
Ketiga variabel, semuanya adalah *borrower* atau peminjam data. Lalu siapa *owner*-nya? jawabannya adalah tidak ada, atau silakan juga simpulkan bahwa data tersebut owner-nya adalah program.
311
311
312
312
Yang lebih penting untuk diurusi pada contoh di atas bukan siapa owner-nya, melainkan bagaimana caranya agar data pinjaman tersebut tidak di-dealokasi saat block kode selesai.
Untuk release, file binary berada dalam path `target/release`. File binary nya adalah optimized, sizenya lebih kecil. Mungkin untuk program `hello world` tidak akan signifikan bedanya, tapi untuk project real sangat dianjurkan untuk menggunakan optimized build.
47
+
Untuk release, file binary berada dalam path `target/release`. File binary nya adalah optimized, size-nya lebih kecil. Mungkin untuk program `hello world` tidak akan signifikan bedanya, tapi untuk project real sangat dianjurkan untuk menggunakan optimized build.
Copy file name to clipboardExpand all lines: docs/basic/closures.md
+12-12Lines changed: 12 additions & 12 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -4,7 +4,7 @@ title: A.48. Closures
4
4
sidebar_label: A.48. Closures
5
5
---
6
6
7
-
Chapter ini membahas tentang closures. Closures sendiri merupakan block fungsi anonimus (anonymous function) yang memiliki kelebihan bisa mengakses item-item yang posisinya berada di luar block closure tersebut tetapi masih dalam current block scope.
7
+
Chapter ini membahas tentang closures. Closures sendiri merupakan block fungsi anonim (anonymous function) yang memiliki kelebihan bisa mengakses item-item yang posisinya berada di luar block closure tersebut tetapi masih dalam current block scope.
8
8
9
9
Topik closures sangat erat hubungannya dengan [Trait ➜ Function](/basic/trait-function), namun pada chapter ini pembahasan hanya difokuskan pada bagian penerapan closures saja. Penulis anjurkan untuk lanjut ke chapter berikutnya setelah selesai dengan chapter ini.
10
10
@@ -57,8 +57,8 @@ Sebagai contoh, variabel `pi` berikut memiliki 0 digit angka dibelakang koma. Un
57
57
```rust
58
58
letpi=3.1415926535;
59
59
60
-
println!("{:.4}", pi); // 3.1416
61
-
println!("{pi:.4}"); // 3.1416
60
+
println!("{:.4}", pi); //output ➜ 3.1416
61
+
println!("{pi:.4}"); //output ➜ 3.1416
62
62
```
63
63
64
64
## A.48.2. Notasi penulisan closure
@@ -127,8 +127,8 @@ Tidak ada yang spesial mengenai cara mengakses item yang berada di luar block cl
127
127
letnum=5;
128
128
letdisplay=||println!("{num}");
129
129
130
-
println!("{num}"); // 5
131
-
display(); // 5
130
+
println!("{num}"); //output ➜ 5
131
+
display(); //output ➜ 5
132
132
```
133
133
134
134
Beda lagi jika data di luar block closure adalah diubah (di-mutate) nilainya dari dalam closure, jika seperti itu maka ada beberapa hal yang perlu diperhatikan.
@@ -143,7 +143,7 @@ let increase_by = |x: i32| {
143
143
};
144
144
145
145
increase_by(10);
146
-
println!("{num}"); // 15
146
+
println!("{num}"); //output ➜ 15
147
147
```
148
148
149
149

@@ -177,7 +177,7 @@ let mut increase_by = |x: i32| num += x;
177
177
num+=5;
178
178
increase_by(10);
179
179
180
-
println!("{num}"); // 20
180
+
println!("{num}"); //output ➜ 20
181
181
```
182
182
183
183

@@ -197,7 +197,7 @@ num += 5;
197
197
increase_by(10);
198
198
}
199
199
200
-
println!("{num}"); // 20
200
+
println!("{num}"); //output ➜ 20
201
201
```
202
202
203
203
Solusi di atas efektif untuk menghilangkan error borrowing yang sebelumnya muncul, tapi setelah d-refactor kode menjadi tidak sesuai spesifikasi awal. Pada kode yang baru di atas, deklarasi closure `increase_by` terjadi di dalam block expression, artinya closure ini hanya akan bisa digunakan pada block kode tersebut saja, tidak bisa di-reuse di luar block.
Pada contoh di atas, closure `increase_by` ditambahi parameter baru. Sekarang ada 2 parameter, yaitu `num` yang tipe-nya adalah pointer `&mut i32` dan parameter `x`. Di dalam block closure, `num` di-dereference (menggunakan operator `*`) kemudian diubah nilainya. Setelah eksekusi statement selesai, data pinjaman tersebut langsung dikembalikan ke pemilik. Inilah kenapa kode di atas tidak menghasilkan error.
@@ -228,11 +228,11 @@ Contohnya bisa dilihat berikut ini:
228
228
letmutnum=5;
229
229
letmutincrease_by=move|x:i32| {
230
230
num+=x;
231
-
println!("{num} (from closure)"); // 15
231
+
println!("{num} (from closure)"); //output ➜ 15
232
232
};
233
233
234
234
increase_by(10);
235
-
println!("{num}"); // 5
235
+
println!("{num}"); //output ➜ 5
236
236
```
237
237
238
238
Closure `increase_by` di atas memiliki keyword `move` dalam pendefinisiannya. Dengan ini maka semua variabel di luar scope closure jika diakses dari dalam closure, maka variabel tersebut berpindah owner-nya (*move semantics*).
Copy file name to clipboardExpand all lines: docs/basic/datetime.md
+11-7Lines changed: 11 additions & 7 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -22,6 +22,8 @@ edition = "2021"
22
22
chrono = "0.4.44"
23
23
```
24
24
25
+
> Silakan gunakan versi terbaru crate `chrono` yang tersedia di [crates.io](https://crates.io/crates/chrono)
26
+
25
27
## A.52.2. Tipe data `DateTime`
26
28
27
29
`chrono` menyediakan cukup banyak tipe data untuk merepresentasikan informasi tanggal dan waktu, tetapi yang paling penting untuk diketahui dan dipahami ada dua, yaitu:
@@ -186,7 +188,8 @@ let sample_date_in_local_tz = Local.from_local_datetime(&naive_date_time).unwrap
186
188
println!("sample date 1 (in utc): {sample_date_in_utc}");
187
189
println!("sample date 2 (in local_tz): {sample_date_in_local_tz}");
188
190
189
-
// output ➜
191
+
// output ⬇️
192
+
//
190
193
// sample date 1 (in utc): 2018-04-28 03:15:22 UTC
191
194
// sample date 2 (in local_tz): 2018-04-28 03:15:22 +07:00
192
195
```
@@ -215,7 +218,8 @@ println!("date (in utc): {date_in_utc}");
0 commit comments