diff --git a/docs-wip/recoverable-error-handling.md b/docs-wip/recoverable-error-handling.md index a4fd8b63..45553e68 100644 --- a/docs-wip/recoverable-error-handling.md +++ b/docs-wip/recoverable-error-handling.md @@ -21,7 +21,7 @@ Operator `?` digunakan untuk meng-*unwrap* data `Option` untuk mengambil nilai ` > Operator `?` bisa digunakan pada tipe `Option` maupun [Result](/basic/result-type). -Pada kode berikut kita akan kode sederhana untuk operasi pembagian bilangan random terhadap angka `x`. Silakan praktekan dan pelajari. +Pada kode berikut kita akan kode sederhana untuk operasi pembagian bilangan random terhadap angka `x`. Silakan praktikkan dan pelajari. ```rust use rand::Rng; @@ -67,7 +67,7 @@ Output program: Di dalam fungsi `do_compute_random_number_by_x()` terdapat operasi *error handling* menggunakan keyword `match`. Nilai hasil operasi `divider(n, x)` dicek, jika berisi `None` maka pesan *warning* dimunculkan dan nilai `0` dikembalikan. Sebaliknya, maka nilai hasil operasi pembagian dijadikan nilai balik. -Sekarang rubah kode fungsi `do_compute_random_number_by_x()` menjadi seperti ini: +Sekarang ubah kode fungsi `do_compute_random_number_by_x()` menjadi seperti ini: ```rust fn do_compute_random_number_by_x(x: i32) { diff --git a/docs/CONTRIBUTING.md b/docs/CONTRIBUTING.md index f638b619..3460fd7f 100644 --- a/docs/CONTRIBUTING.md +++ b/docs/CONTRIBUTING.md @@ -37,6 +37,7 @@ Berikut merupakan hall of fame kontributor yang sudah berbaik hati menyisihkan w 1. [Opa Kholis Majid](https://github.com/opakholis) 1. [Rian](https://github.com/rian256) 1. [Shandy Siswandi](https://github.com/shandysiswandi) +1. [Sultan Fariz](https://github.com/sultanfariz) 1. [Taruna Wahyudi](https://github.com/tarunawahyudi) 1. [Theis Andatu](https://github.com/antheiz) 1. ... anda :-) diff --git a/docs/basic/advanced-traits.md b/docs/basic/advanced-traits.md index 806e25a1..a46ab19c 100644 --- a/docs/basic/advanced-traits.md +++ b/docs/basic/advanced-traits.md @@ -160,7 +160,7 @@ calculate_and_print_result("square".to_string(), &square_one); Bagaimana jika, parameter fungsi `item` di atas tipenya bisa lebih dari 1 trait, misalnya trait `Area` dan `Circumference`, apakah bisa? Jawabannya bisa. -Mari praktekan. Lakukan modifikasi berikut pada beberapa kode yang telah di tulis. +Mari praktikkan. Lakukan modifikasi berikut pada beberapa kode yang telah di tulis. - File `src/calculation_spec.rs` @@ -324,7 +324,7 @@ Tipe data aslinya tetap bisa diakses, tapi butuh tambahan effort. Lebih jelasnya ## A.37.7. *Associated types* pada trait -Associated types adalah tipe data yang didefinisikan di dalam suatu trait. Associated types tidak tidak memiliki tipe data konkret saat didefinisikan, namun ketika trait di-implementasikan maka tipe tersebut harus ditentukan tipe data konkritnya. +Associated types adalah tipe data yang didefinisikan di dalam suatu trait. Associated types tidak tidak memiliki tipe data konkret saat didefinisikan, namun ketika trait diimplementasikan maka tipe tersebut harus ditentukan tipe data konkretnya. Lebih jelas silakan perhatikan kode berikut: @@ -340,7 +340,7 @@ Pada definisi trait `Shape` di atas, yang disebut dengan associated types adalah Associated types ini sering digunakan pada Rust programming. -Lanjut skenario praktek berikutnya. Silakan siapkan package/project baru dengan struktur seperti ini: +Lanjut skenario praktik berikutnya. Silakan siapkan package/project baru dengan struktur seperti ini: ```bash title="package source code structure" my_package @@ -368,7 +368,7 @@ pub trait Shape { Trait `Shape` di atas spesifikasinya mirip seperti pada contoh sebelumnya, hanya saja kali ini trait-nya di set public agar bisa diakses dari `main.rs` nantinya. -Trait `Shape` kemudian di-implementasikan ke struct `Circle` dan `Square`, kode-nya bisa dilihat berikut: +Trait `Shape` kemudian diimplementasikan ke struct `Circle` dan `Square`, kode-nya bisa dilihat berikut: ```rust title="src/circle.rs" pub struct Circle { @@ -431,7 +431,7 @@ O iya, pada `main.rs`, module item `shape::Shape` perlu di-import meskipun kita ## A.37.8. Attribute `derive` -Ada cara lain untuk mengimplementasikan suatu trait ke dalam tipe data selain dengan menuliskan implementasinya secara eksplist, caranya menggunakan attribute `derive`. +Ada cara lain untuk mengimplementasikan suatu trait ke dalam tipe data selain dengan menuliskan implementasinya secara eksplisit, caranya menggunakan attribute `derive`. Lebih detailnya dibahas pada chapter [Attributes](/basic/attributes). diff --git a/docs/basic/array.md b/docs/basic/array.md index c0e1cea6..14d5489b 100644 --- a/docs/basic/array.md +++ b/docs/basic/array.md @@ -94,7 +94,7 @@ Array hanya bisa diakses elemennya sesuai size saat deklarasi. Sebagai contoh, v ### ◉ Mengubah isi elemen array -Array bisa diubah isi elemen-nya jika variabel tersebut adalah `mutable`. Pada contoh yang sudah dibuat, variabel `numbers` dideklarasikan mutable dengan tipe data elemen adalah numerik. Dengan ini kita bisa mengubah value elemen array dengan value baru bertipe data sama. +Array bisa diubah isi elemennya jika variabel tersebut adalah `mutable`. Pada contoh yang sudah dibuat, variabel `numbers` dideklarasikan mutable dengan tipe data elemen adalah numerik. Dengan ini kita bisa mengubah value elemen array dengan value baru bertipe data sama. Bisa dilihat pada contoh yang sudah dipraktikkan, elemen indeks ke-1 diubah nilainya menjadi `16`, dan elemen indeks ke-3 value-nya menjadi `8` @@ -103,9 +103,9 @@ numbers[1] = 16; numbers[3] = 8; ``` -Array hanya bisa diubah elemen-nya sesuai size saat deklarasi. Sebagai contoh, variabel `numbers` yang size nya 4, jika dipaksa mengakses dan/atau mengubah elemen indeks ke-7 maka akan menghasilkan error. +Array hanya bisa diubah elemennya sesuai size saat deklarasi. Sebagai contoh, variabel `numbers` yang size nya 4, jika dipaksa mengakses dan/atau mengubah elemen indeks ke-7 maka akan menghasilkan error. -Selain itu, operasi assignment atau pengubahan nilai pada elemen array hanya bisa dilakukan dengan tipe data yang sama. Pada contoh di atas `numbers` adalah array bertipe numerik, karenanya tidak akan bisa diubah nilai elemen-nya dengan tipe lain, dan jika dipaksa akan menghasilkan error. +Selain itu, operasi assignment atau pengubahan nilai pada elemen array hanya bisa dilakukan dengan tipe data yang sama. Pada contoh di atas `numbers` adalah array bertipe numerik, karenanya tidak akan bisa diubah nilai elemennya dengan tipe lain, dan jika dipaksa akan menghasilkan error. ### ◉ Formatted print `{:?}` diff --git a/docs/basic/attributes.md b/docs/basic/attributes.md index 191f3e26..4d1dc905 100644 --- a/docs/basic/attributes.md +++ b/docs/basic/attributes.md @@ -479,7 +479,7 @@ Aturan manajemen di Rust cukup ketat, dan sudah dibahas secara mendetal pada cha Rust memiliki sebuah attribute bernama `path` yang berguna untuk meng-override 2 aturan di atas secara paksa. Dengan memanfaatkan attribute ini kita bisa menulis module dengan nama sesuka hati. -Mari kita praktekan agar lebih jelas. Silakan buat package baru dengan struktur seperti berikut: +Mari kita praktikkan agar lebih jelas. Silakan buat package baru dengan struktur seperti berikut: ```bash title="package source code structure" my_package diff --git a/docs/basic/closures.md b/docs/basic/closures.md index 17a63862..c25fc6ce 100644 --- a/docs/basic/closures.md +++ b/docs/basic/closures.md @@ -89,7 +89,7 @@ let do_something_v4 = || { }; ``` -Jika tipe return value tidak dideklarasikan secara eksplist, maka Rust menganggap tipe return value adalah sesuai dengan tipe data pada statement terakhir. +Jika tipe return value tidak dideklarasikan secara eksplisit, maka Rust menganggap tipe return value adalah sesuai dengan tipe data pada statement terakhir. Untuk closure yang isinya hanya 1 baris statement, boleh tidak dituliskan block kurung kurawal-nya (`{}`). @@ -162,7 +162,7 @@ let mut increase_by = |x: i32| { }; ``` -Keyword `mut` wajib ditambahkan ke variabel penampung closure ketika di dalamnya terdapat operasi perubahan data terhadap variabel yang posisinya di-luar closure. Contohnya bisa dilihat di atas, variabel `num` nilainya di-mutate atau diubah dari dalam closure, karena inilah variabel `increase_by` harus didefinisikan mutable. +Keyword `mut` wajib ditambahkan ke variabel penampung closure ketika di dalamnya terdapat operasi perubahan data terhadap variabel yang posisinya di luar closure. Contohnya bisa dilihat di atas, variabel `num` nilainya di-mutate atau diubah dari dalam closure, karena inilah variabel `increase_by` harus didefinisikan mutable. ## A.48.4. Borrowing pada closure @@ -377,7 +377,7 @@ Fungsi `find_index` memiliki 2 parameter generic, yaitu: - `T` yang digunakan sebagai tipe data element slice `data`. - `F` yang digunakan sebagai tipe data closure `cond_fn` dengan skema `Fn(&T) -> bool`, yang jika diilustrasikan dalam bentuk closure adalah `|param1: &T| -> bool { }`. -Di dalam fungsi tersebut, data slice di-loop, kemudian tiap elemen-nya digunakan sebagai parameter pemanggilan closure `cond_fn`. +Di dalam fungsi tersebut, data slice di-loop, kemudian tiap elemennya digunakan sebagai parameter pemanggilan closure `cond_fn`. Jika nilai balik pemanggilan closure adalah `true` maka `i` dikembalikan dalam bentuk `i32` (ada proses casting). Dan jika tidak diketemukan, maka indeks `-1` dikembalikan. diff --git a/docs/basic/datetime.md b/docs/basic/datetime.md index 7105c6e7..0c1a861e 100644 --- a/docs/basic/datetime.md +++ b/docs/basic/datetime.md @@ -49,7 +49,7 @@ Tipe `chrono::naive::datetime::NaiveDateTime` merupakan tipe data datetime yang Ada banyak cara untuk membuat date time, dan kita akan bahas satu-per-satu. -Cara yang pertama, mari kita pelajari sambil praktek. Isi file program `main.rs` dengan kode berikut, lalu jalankan. +Cara yang pertama, mari kita pelajari sambil praktik. Isi file program `main.rs` dengan kode berikut, lalu jalankan. ```rust use chrono::prelude::*; @@ -166,7 +166,7 @@ Rust memilik caranya sendiri dalam pengelolaan data datetime (yang menurut penul Tipe data ini sangat berguna dibeberapa case yang kebanyakan adalah perihal konversi data ke bentuk `DateTime`. -Mari kita praktekan dengan contoh agar lebih jelas. Dimisalkan ada keperluan di mana data UNIX time perlu di konversi ke 2 bentuk `DateTime`, dengan timezone offset `Utc` dan `Local`. Pada kasus ini, cara ke-3 dari praktek sebelumnya bisa dilakukan untuk penyelesaian case ini. +Mari kita praktikkan dengan contoh agar lebih jelas. Dimisalkan ada keperluan di mana data UNIX time perlu di konversi ke 2 bentuk `DateTime`, dengan timezone offset `Utc` dan `Local`. Pada kasus ini, cara ke-3 dari praktik sebelumnya bisa dilakukan untuk penyelesaian case ini. ```rust let timestamp: u64 = 1524885322; diff --git a/docs/basic/generics.md b/docs/basic/generics.md index 4615f51d..b948bf6e 100644 --- a/docs/basic/generics.md +++ b/docs/basic/generics.md @@ -6,7 +6,7 @@ sidebar_label: A.38. Generics Chapter ini membahas tentang generics. -Generics sendiri merupakan salah satu fitur yang ada pada beberapa bahasa pemrograman (termasuk Rust), yang digunakan untuk menambahkan fleksibilitas dalam pemanfaatan tipe data pada suatu block kode. Dengan adanya generics, kita bisa menentukan tipe data yang digunakan pada parameter maupun return value sbuah block fungsi, method dan lainnya. +Generics sendiri merupakan salah satu fitur yang ada pada beberapa bahasa pemrograman (termasuk Rust), yang digunakan untuk menambahkan fleksibilitas dalam pemanfaatan tipe data pada suatu block kode. Dengan adanya generics, kita bisa menentukan tipe data yang digunakan pada parameter maupun return value sebuah block fungsi, method dan lainnya. Generics dinotasikan dengan ``. Kita sempat sedikit memanfaatkan generic pada chapter [Vector](/basic/vector) di mana dalam pendefinisian tipe data harus dituliskan juga tipe data item (via generics parameter), contoh `Vec`, `Vec<&str>`, dll. Kita juga sempat sedikit belajar tentang topik generic pada chapter [Traits](/basic/traits). diff --git a/docs/basic/komentar.md b/docs/basic/komentar.md index 6aae1dfd..5a10a864 100644 --- a/docs/basic/komentar.md +++ b/docs/basic/komentar.md @@ -13,7 +13,7 @@ Rust menggunakan double slash (`//`) sebagai penanda *line comment* atau baris k ```rust fn main() { // ini adalah komentar - // komentar tidak akan di-eksekusi + // komentar tidak akan dieksekusi println!("hello"); } ``` diff --git a/docs/basic/konstanta.md b/docs/basic/konstanta.md index f7c564c2..8c19607f 100644 --- a/docs/basic/konstanta.md +++ b/docs/basic/konstanta.md @@ -16,9 +16,9 @@ const PI: f32 = 22.0/7.0; println!("{} {}", LABEL, PI); ``` -Bisa dilihat di kode di atas, konstanta `LABEL` merupakan string dengan nilai `"nilai pi adalah:"`, sedang `PI` memiliki nilai bertipe float hasil dari operasi `22./7.0`. +Bisa dilihat di kode di atas, konstanta `LABEL` merupakan string dengan nilai `"nilai pi adalah:"`, sedang `PI` memiliki nilai bertipe float hasil dari operasi `22.0/7.0`. -Dalam pendefinisian konstanta, tipe data harus dituliskan secara eksplist. Deklarasi seperti `const DATA = "x"` akan menghasilkan error saat proses kompilasi. Dan aturan ini berlaku untuk semua tipe data yang dipergunakan untuk pendefinisian konstanta. +Dalam pendefinisian konstanta, tipe data harus dituliskan secara eksplisit. Deklarasi seperti `const DATA = "x"` akan menghasilkan error saat proses kompilasi. Dan aturan ini berlaku untuk semua tipe data yang dipergunakan untuk pendefinisian konstanta. Nilai sebuah konstanta juga bisa dari variabel atau konstanta lain, atau hasil sebuah operasi seperti operasi aritmatika `22.0/7.0`. diff --git a/docs/basic/lifetime.md b/docs/basic/lifetime.md index 8026f5df..fff7dcdc 100644 --- a/docs/basic/lifetime.md +++ b/docs/basic/lifetime.md @@ -162,9 +162,9 @@ Ok, tapi entah kenapa ketika dilihat masih muncul error. ![Lifetime](img/lifetime-3.png) -Error tersebut muncul karena meskipun owner data `&13` adalah program, ketika eksekusi fungsi `get_number` selesai, data borrow tersebut langsung di-dealokasi, dan tidak ada variabel lain di-luar scope yang menampung reference data tersebut. +Error tersebut muncul karena meskipun owner data `&13` adalah program, ketika eksekusi fungsi `get_number` selesai, data borrow tersebut langsung di-dealokasi, dan tidak ada variabel lain di luar scope yang menampung reference data tersebut. -Agar tidak terjadi proses dealokasi, harus ada variabel yang menampung reference tersebut di-luar scope, tapi cara ini tidak bisa dilakukan karena data-nya saja baru dideklarasikan dalam block fungsi, tidak mungkin tiba-tiba ada yang menampung di-luar scope. +Agar tidak terjadi proses dealokasi, harus ada variabel yang menampung reference tersebut di luar scope, tapi cara ini tidak bisa dilakukan karena data-nya saja baru dideklarasikan dalam block fungsi, tidak mungkin tiba-tiba ada yang menampung di luar scope. Solusi dari masalah ini adalah menggunakan lifetime `'static` (yang detailnya sudah dibahas pada chapter sebelumnya). Dengan ini maka data reference `&13` hidup lebih lama dari umur yang sebenarnya sudah ditakdirkan untuk data data tersebut. @@ -302,7 +302,7 @@ Sampai section ini kita telah mempelajari kurang lebih 4 point berikut: 1. Setiap data, lebih tepatnya setiap reference memiliki lifetime. 2. Lifetime digunakan oleh Rust dalam penentuan kapan reference tersebut di-dealokasi. -3. Pada beberapa case, lifetime perlu di-urus secara eksplisit (contohnya seperti pada fungsi `do_something_vx` di atas). +3. Pada beberapa case, lifetime perlu diurus secara eksplisit (contohnya seperti pada fungsi `do_something_vx` di atas). 4. Pengecekan lifetime terjadi saat kompilasi. Rust memiliki sesuatu yang disebut dengan **lifetime elision**, isinya adalah aturan yang digunakan oleh Rust dalam menganalisa reference untuk menentukan lifetime *default*-nya. diff --git a/docs/basic/module-basic.md b/docs/basic/module-basic.md index 5554c7a7..5abf19e3 100644 --- a/docs/basic/module-basic.md +++ b/docs/basic/module-basic.md @@ -10,7 +10,7 @@ Module adalah salah satu chapter yang cukup penting dalam pemrograman Rust. Pada Setiap bahasa pemrograman memiliki caranya sendiri dalam hal pengelolahan struktur files dan folder dalam project. Project yang isinya ada sangat banyak hal diatur sedemikian rupa menjadi beberapa bagian dan/atau sub-bagian sesuai dengan fungsinya masing-masing. -Di Rust, module memiliki hirarki (biasa disebut dengan *module tree*) yang *root*/akarnya adalah file entrypoint crate, yaitu `main.rs` untuk *binary crate* dan `lib.rs` untuk *library crate*. Kedua file ini biasa disebut dengan *crate root file*. +Di Rust, module memiliki hierarki (biasa disebut dengan *module tree*) yang *root*/akarnya adalah file entrypoint crate, yaitu `main.rs` untuk *binary crate* dan `lib.rs` untuk *library crate*. Kedua file ini biasa disebut dengan *crate root file*. > Di sini pembahasan akan fokus pada penerapan module dalam *binary crate*. Kita belum masuk ke pembahasan tentang *library crate*. @@ -26,7 +26,7 @@ Pendefinisian nama module sendiri berada pada file entrypoint *crate* yaitu `mai - Nama module ditulis di `main.rs` (atau `lib.rs` untuk library crate) - Item atau isi module ditulis dalam file `nama_module.rs` atau `nama_module/mod.rs` -> Sebenarnya ada beberapa hal lainnya lagi yang masih relevan yang perlu dibahas di-awal, yaitu perihal sub-module. Akan tetapi agar tidak makin bingung, mari kita lanjut ke praktik terlebih dahulu. +> Sebenarnya ada beberapa hal lainnya lagi yang masih relevan yang perlu dibahas di awal, yaitu perihal sub-module. Akan tetapi agar tidak makin bingung, mari kita lanjut ke praktik terlebih dahulu. ## A.20.2. Praktik #1 - `nama_module.rs` @@ -129,7 +129,7 @@ Selain fungsi, module item bisa dalam bentuk lainnya, contohnya: konstanta, subm ## A.20.3. Praktik #2 - `nama_module/mod.rs` -Bagian ini merupakan kelanjutan dari praktik sebelumnya. Program sederhana yang sudah di-buat ditambahi beberapa hal. Data inputan user dikonversi ke bentuk angka untuk kemudian dicek apakah angka tersebut bilangan ganjil atau genap. +Bagian ini merupakan kelanjutan dari praktik sebelumnya. Program sederhana yang sudah dibuat ditambahi beberapa hal. Data inputan user dikonversi ke bentuk angka untuk kemudian dicek apakah angka tersebut bilangan ganjil atau genap. Fungsi untuk konversi string ke bentuk numerik dan juga untuk pengecekan bilangan ganjil genap, adalah dua buah item milik module bernama `my_number` yang akan kita definisikan sebentar lagi. diff --git a/docs/basic/module-inline.md b/docs/basic/module-inline.md index 19531626..1e23dd13 100644 --- a/docs/basic/module-inline.md +++ b/docs/basic/module-inline.md @@ -41,7 +41,7 @@ Aturan definisi submodule dan item pada inline module masih sama seperti pada *n ## A.21.2. Praktik inline module -Mari lanjut proses pembalajaran dengan praktik. Kita akan buat program sederhana yang di dalamnya ada proses generate random string, yang kemudian di-hash. +Mari lanjut proses pembelajaran dengan praktik. Kita akan buat program sederhana yang di dalamnya ada proses generate random string, yang kemudian di-hash. Silakan buat package baru menggunakan `cargo new`. Penulis di sini memilih nama `inline_module_1` sebagai nama package. Setelah itu, siapkan fungsi main dan juga module bernama `utilities` dengan penulisan kode menerapkan inline module. O iya, tulis keduanya (`module utilities` dan fungsi `main`) dalam satu file yang sama yaitu `main.rs`. diff --git a/docs/basic/operator-tanda-tanya.md b/docs/basic/operator-tanda-tanya.md index f4288d81..cae2d976 100644 --- a/docs/basic/operator-tanda-tanya.md +++ b/docs/basic/operator-tanda-tanya.md @@ -15,7 +15,7 @@ Penggunaannya terhadap tipe data `Result` cukup umum untuk keperluan penan - Jika nilai object adalah bertipe `T`, maka yang dikembalikan adalah nilai `T` - Jika nilai object adalah bertipe `E`, maka yang dikembalikan adalah nilai `E` atau error. -Agar lebih mudah memahami kegunaan dari operator ini, pembelajaran lebih baik dimulai dengan praktik kode yang didalamnya ada penerapan tipe data `Result` (atau `Option`). Di contoh berikut, tipe data `Result` kita pilih untuk praktek. +Agar lebih mudah memahami kegunaan dari operator ini, pembelajaran lebih baik dimulai dengan praktik kode yang didalamnya ada penerapan tipe data `Result` (atau `Option`). Di contoh berikut, tipe data `Result` kita pilih untuk praktik. Silakan tulis kode berikut, pelajari, kemudian jalankan. diff --git a/docs/basic/ownership.md b/docs/basic/ownership.md index fc1f50e7..6d7d2d0e 100644 --- a/docs/basic/ownership.md +++ b/docs/basic/ownership.md @@ -322,7 +322,7 @@ fn say_hello(param: String) { Ok, dengan ini masalah untuk me-reuse data yang bisa berpindah ownernya dianggap beres. Memang beres, tapi apakah cara ini baik kalau dilihat dari sudut pandang memory management? -Konsekuensi dari cloning data adalah terjadi proses alokasi lagi di memory. Data akan di-duplikasi dan dialokasikan ke alamat memory baru, jadinya kurang efisien. Ditambah lagi, jika kita mengacu ke penjelasan pada chapter [Memory Management ➜ Heap Memory](/basic/basic-memory-management#a324-heap-memory), data `String` isinya disimpan di heap memory yang pengaksesannya lebih lambat dibanding pengaksesan data stack. Dari sini bisa disimpulkan bahwa cloning bukan solusi yang paling baik (kecuali terpaksa). +Konsekuensi dari cloning data adalah terjadi proses alokasi lagi di memory. Data akan diduplikasi dan dialokasikan ke alamat memory baru, jadinya kurang efisien. Ditambah lagi, jika kita mengacu ke penjelasan pada chapter [Memory Management ➜ Heap Memory](/basic/basic-memory-management#a324-heap-memory), data `String` isinya disimpan di heap memory yang pengaksesannya lebih lambat dibanding pengaksesan data stack. Dari sini bisa disimpulkan bahwa cloning bukan solusi yang paling baik (kecuali terpaksa). **Solusi yang lebih baik adalah dengan melakukan operasi pinjam data dari owner aslinya tanpa perlu melakukan operasi perpindahan owner**, yang pada Rust programming disebut dengan **borrowing**. diff --git a/docs/basic/package-crate.md b/docs/basic/package-crate.md index ed6141ae..bfa99d15 100644 --- a/docs/basic/package-crate.md +++ b/docs/basic/package-crate.md @@ -81,7 +81,7 @@ Blok `package` berisi berisi 3 buah field: - `name` isinya adalah nama package, sesuai dengan argument command `cargo new `. - `version` default-nya selalu `0.1.0`, namun kita bisa ubah nilainya seiring berjalannya proses pengembangan aplikasi. -- `edition` di sini me-refer ke edisi rust yang dipakai. Di ebook ini, rust versi **1.65.0** digunakan, dan edisi untuk versi tersebut adalah `2021`. +- `edition` di sini me-refer ke edisi Rust yang dipakai. Di ebook ini, Rust versi **1.65.0** digunakan, dan edisi untuk versi tersebut adalah `2021`. Blok `dependencies` default-nya berisi kosong. Jika kita menambahkan external dependencies atau crates, maka detailnya tercatat pada blok `dependencies` ini. diff --git a/docs/basic/path-item.md b/docs/basic/path-item.md index 9acf2e04..46848495 100644 --- a/docs/basic/path-item.md +++ b/docs/basic/path-item.md @@ -158,7 +158,7 @@ if reader_res.is_err() { Jika program berlajan sesuai harapan, tanpa error, pada baris terakhir data dalam `message` ditampilkan ke layar. -> Tipe data `String` ini tidak perlu di-konversi ke bentuk literal string `&str` untuk ditampilkan menggunakan `println`. Langsung saja sisipkan variabel `String` ke macro tersebut dan `println` akan tau harus menampilkan apa. +> Tipe data `String` ini tidak perlu dikonversi ke bentuk literal string `&str` untuk ditampilkan menggunakan `println`. Langsung saja sisipkan variabel `String` ke macro tersebut dan `println` akan tau harus menampilkan apa. Oke, Penulis rasa sudah cukup jelas perihal bagaimana cara menggunakan path untuk mengakses item. Cukup tulis saja path-nya. Jika path-nya panjang? ya ditulis semua. diff --git a/docs/basic/pointer-references.md b/docs/basic/pointer-references.md index 02489298..3dcc8b4d 100644 --- a/docs/basic/pointer-references.md +++ b/docs/basic/pointer-references.md @@ -158,7 +158,7 @@ Variabel `number_one` adalah data numerik bertipe `i32`, eksekusi statement ters Kemudian ada lagi statement `number_two`. Meskipun nilainya didapat dari variabel `number_one`, yang terjadi di balik layar adalah Rust akan mengalokasikan lagi alamat memory selebar 32-bit untuk menampung data `number_two` yang didapat dari hasil operasi **copy** dari variabel `number_one`. -> Semua variabel primitif di Rust mengadopsi *copy semantics*, yang artinya jika variabel tersebut digunakan dalam statement assignment, maka nilai akan di-duplikasi untuk kemudian ditampung pada variabel baru. +> Semua variabel primitif di Rust mengadopsi *copy semantics*, yang artinya jika variabel tersebut digunakan dalam statement assignment, maka nilai akan diduplikasi untuk kemudian ditampung pada variabel baru. > > Lebih jelasnya mengenai *copy semantics* dibahas pada chapter [Ownership](/basic/ownership#a334-copy-semantics-vs-move-semantics). diff --git a/docs/basic/recoverable-error-handling.md b/docs/basic/recoverable-error-handling.md index a45d7c19..f3a3cc6a 100644 --- a/docs/basic/recoverable-error-handling.md +++ b/docs/basic/recoverable-error-handling.md @@ -6,7 +6,7 @@ sidebar_label: A.55. Error ➜ Recoverable Error & Error Handling Chapter ini merupakan kelanjutan dari chapter sebelumnya tentang pembahasan topic error. Kali ini fokus kita lebih ke **recoverable error** dan penanganannya (*error handling* / *error propagation*). -Best practice penanganan error di Rust adalah dengan mengkombinasikan keyword `match` dengan tipe data `Result`. Untuk penerapannya sendiri sebenarnya sudah cukup sering dipraktikan di chapter-chapter sebelumnya. +Best practice penanganan error di Rust adalah dengan mengkombinasikan keyword `match` dengan tipe data `Result`. Untuk penerapannya sendiri sebenarnya sudah cukup sering dipraktikkan di chapter-chapter sebelumnya. Pada chapter ini pembelajaran dilakukan dengan lebih banyak menulis kode (*coding*), dengan ini penulis harapkan pembaca bisa terbiasa dan nyaman dengan gaya penanganan error di Rust. diff --git a/docs/basic/result-type.md b/docs/basic/result-type.md index a2183ccd..158276c2 100644 --- a/docs/basic/result-type.md +++ b/docs/basic/result-type.md @@ -253,7 +253,7 @@ Tipe ini dimanfaatkan untuk error handling di Rust. Lebih jelasnya mengenai topi ## A.40.6. Tipe `Result<(), E>` -Di atas kita telah mempelajari dan mempraktekan fungsi `divider()` yang fungsi tersebut mengembalikan 2 informasi, yaitu: +Di atas kita telah mempelajari dan mempraktikkan fungsi `divider()` yang fungsi tersebut mengembalikan 2 informasi, yaitu: - `T` berisi nilai hasil pembagian - `E` berisi error saat operasi pembagian diff --git a/docs/basic/slice-memory-management.md b/docs/basic/slice-memory-management.md index fc1d18f0..b649fc0e 100644 --- a/docs/basic/slice-memory-management.md +++ b/docs/basic/slice-memory-management.md @@ -75,7 +75,7 @@ Slice adalah data borrow, artinya jika ada beberapa variabel baru dibuat hasil d Sekarang di stack memory ada 3 buah metadata informasi disimpan, yaitu `data_str` (yang merupakan owner sebenarnya data), dan `slice1` & `slice2`. Sedangkan untuk data-nya sendiri tetap berada di heap memory tanpa ada perubahan. -Tiga variabel di atas kesemuanya mengakses reference yang sama, yang membedakan adalah elemen-nya saja. Owner (yaitu `data_str`) bisa mengakses seluruh data, selain itu juga tau informasi kapasitas data. Sedangkan borrower hanya bisa mengakses data yang dia pinjam sesuai dengan operasi slicing-nya. Borrower tidak mengetahui kapasitas data, namun ia tau size dari elemen yang ia pinjam. +Tiga variabel di atas kesemuanya mengakses reference yang sama, yang membedakan adalah elemennya saja. Owner (yaitu `data_str`) bisa mengakses seluruh data, selain itu juga tau informasi kapasitas data. Sedangkan borrower hanya bisa mengakses data yang dia pinjam sesuai dengan operasi slicing-nya. Borrower tidak mengetahui kapasitas data, namun ia tau size dari elemen yang ia pinjam. ## A.45.2. Mutable slice diff --git a/docs/basic/string-slice-vs-string-literal.md b/docs/basic/string-slice-vs-string-literal.md index e5620d6f..17cfcf0c 100644 --- a/docs/basic/string-slice-vs-string-literal.md +++ b/docs/basic/string-slice-vs-string-literal.md @@ -55,7 +55,7 @@ String literal hanya bisa direpresentasikan dalam bentuk reference `&str` (point Tipe `&str` termasuk kategori tipe data yang **unowned** atau reference tanpa owner (atau boleh juga diartikan sebagai tipe data yang owner-nya adalah program). -Rust menjamin data string literal selalu valid. Kita juga bisa menentukan lifetime-nya secara eksplist jike diperlukan, contohnya pada tipe `&'static str`. +Rust menjamin data string literal selalu valid. Kita juga bisa menentukan lifetime-nya secara eksplisit jike diperlukan, contohnya pada tipe `&'static str`. Cara termudah membuat `&str` adalah menggunakan string literal. diff --git a/docs/basic/trait-iterator.md b/docs/basic/trait-iterator.md index 4ebc5c96..e0f381dd 100644 --- a/docs/basic/trait-iterator.md +++ b/docs/basic/trait-iterator.md @@ -151,7 +151,7 @@ println!("{numbers:?}"); Program di atas melakukan beberapa hal: -1. Data `data_vec` yang merupakan koleksi string di-konversi menjadi object `Iterator` menggunakan method `iter`. +1. Data `data_vec` yang merupakan koleksi string dikonversi menjadi object `Iterator` menggunakan method `iter`. 1. Kemudian method `map` diakses. Setiap elemen `data_vec` di-iterasi, kemudian dikonversi dari `String` ke `i32`, lalu dijadikan *replacement* data elemen tersebut. Jika proses konversi gagal, maka angka `0` digunakan sebagai data element tersebut. - Sampai sini, data yang sebelumnya `["1", "2", "3", "4", "a"]` sekarang menjadi `[1, 2, 3, 4, 0]`. diff --git a/docs/basic/traits.md b/docs/basic/traits.md index e6b6142a..457cb1bd 100644 --- a/docs/basic/traits.md +++ b/docs/basic/traits.md @@ -19,11 +19,11 @@ Ada dua bagian penting dalam trait yang harus diketahui: 1. Deklarasi trait 2. Implementasi trait ke tipe data -Perihal point pertama, intinya kita bisa menciptakan trait sesuai kebutuhan. Terlepas dari itu, Rust juga menyediakan cukup banyak traits yang di-implement ke banyak tipe data yang ada di Rust standard library. Beberapa di antaranya: +Perihal point pertama, intinya kita bisa menciptakan trait sesuai kebutuhan. Terlepas dari itu, Rust juga menyediakan cukup banyak traits yang diimplement ke banyak tipe data yang ada di Rust standard library. Beberapa di antaranya: - Trait `std::fmt::Debug`, digunakan agar data bisa di-print menggunakan formatted print `{:?}`. - Trait `std::iter::Enumerate`, digunakan agar data bisa di-iterasi menggunakan keyword `for`. -- Trait `std::ops::Add`, di-implementasikan agar data bisa digunakan pada operasi aritmatik penambahan `+`. +- Trait `std::ops::Add`, diimplementasikan agar data bisa digunakan pada operasi aritmatik penambahan `+`. Ok, biar lebih jelas, mari lanjut pembelajaran menggunakan contoh. Kita mulai dengan pembahasan tentang cara implementasi trait. Contoh yang digunakan adalah implementasi salah satu trait milik Rust standard library, yaitu trait `std::fmt::Debug`. @@ -47,7 +47,7 @@ Chapter ini fokusnya adalah pembahasan tentang dasar implementasi **external tra Kita pilih trait `std::fmt::Debug` milik Rust standard library untuk belajar cara implementasi trait pada tipe data. -Kegunaan dari trait ini adalah: jika di-implement ke tipe data tertentu maka data dengan tipe tersebut bisa di-print via macro `println` atau macro printing lainnya, dengan menggunakan formatted print `{:?}`. +Kegunaan dari trait ini adalah: jika diimplement ke tipe data tertentu maka data dengan tipe tersebut bisa di-print via macro `println` atau macro printing lainnya, dengan menggunakan formatted print `{:?}`. Trait `Debug` ini diimplementasikan ke pada banyak tipe data yang di Rust standard library, baik itu tipe primitif maupun non-primitif. Contohnya bisa dilihat pada kode berikut: @@ -195,7 +195,7 @@ Coba tambahkan statement `println`, tetapi kali ini gunakan formatted print `{}` ![Trait](img/traits-4.png) -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 di-implementasikan juga. +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. Ubah kode dengan menambahkan implementasi trait `Display`. Hasilnya kurang lebih seperti ini: diff --git a/docs/basic/unrecoverable-panic-error.md b/docs/basic/unrecoverable-panic-error.md index 05372541..5cf89d4f 100644 --- a/docs/basic/unrecoverable-panic-error.md +++ b/docs/basic/unrecoverable-panic-error.md @@ -136,7 +136,7 @@ Program dieksekusi 2 kali: ### ◉ Statement `io::stdout().flush()` -Dibanding dengan beberapa chapter sebelumnya yang juga ada praktek menangkap inputan user, kode program yang ditulis kali ini disisipi statement baru yaitu `io::stdout().flush()`. Kode tersebut berguna untuk mem-*flush* output STDOUT yang muncul, karena default output STDOUT adalah di-*buffer* oleh Rust. +Dibanding dengan beberapa chapter sebelumnya yang juga ada praktik menangkap inputan user, kode program yang ditulis kali ini disisipi statement baru yaitu `io::stdout().flush()`. Kode tersebut berguna untuk mem-*flush* output STDOUT yang muncul, karena default output STDOUT adalah di-*buffer* oleh Rust. Jika tidak di-flush, ada kemungkinan text `enter your name: ` muncul setelah user mengisi inputan lalu menekan tombol *enter*. diff --git a/docs/basic/use.md b/docs/basic/use.md index 07a064ea..f88f2a79 100644 --- a/docs/basic/use.md +++ b/docs/basic/use.md @@ -8,7 +8,7 @@ Keyword `use` digunakan untuk dua hal, yaitu *import* path dan *re-export* path. ## A.29.1. Keyword `use` untuk import path -Untuk bisa menggunakan sebuah item dari crate lain, entah itu dari rust standard library crate maupun 3rd-party, caranya cukup dengan menuliskan path item. Contohnya bisa dilihat di bawah ini, fungsi `current_dir` digunakan untuk mengambil path dari current directory. Fungsi tersebut merupakan item dari module `std::env`, maka untuk mengaksesnya kita harus menuliskan path secara lengkap. +Untuk bisa menggunakan sebuah item dari crate lain, entah itu dari Rust standard library crate maupun 3rd-party, caranya cukup dengan menuliskan path item. Contohnya bisa dilihat di bawah ini, fungsi `current_dir` digunakan untuk mengambil path dari current directory. Fungsi tersebut merupakan item dari module `std::env`, maka untuk mengaksesnya kita harus menuliskan path secara lengkap. ```rust let package_path = std::env::current_dir().unwrap(); @@ -84,7 +84,7 @@ Bisa dilihat pada gambar berikut, jika ada argument disisipkan dalam eksekusi pr ## A.29.2. Keyword `use` untuk re-export path -Re-export item adalah sebuah cara untuk mem-*bypass* pengaksesan item yang secara hirarki memang tidak bisa diakses dari luar module (bisa jadi karena visibility item ataupun parent module nya adalah private). Dengan teknik ini, maka item pasti bisa diakses dari luar module. +Re-export item adalah sebuah cara untuk mem-*bypass* pengaksesan item yang secara hierarki memang tidak bisa diakses dari luar module (bisa jadi karena visibility item ataupun parent module nya adalah private). Dengan teknik ini, maka item pasti bisa diakses dari luar module. Item yang di-re-export akan menjadi item milik *current module* di mana statement re-export tersebut ditulis. diff --git a/docs/basic/vector.md b/docs/basic/vector.md index aa106990..5c313870 100644 --- a/docs/basic/vector.md +++ b/docs/basic/vector.md @@ -6,7 +6,7 @@ sidebar_label: A.16. Vector Pada chapter ini kita akan belajar tetang tipe data *Vector*. Vector adalah tipe data seperti array tapi dinamis. Dinamis di sini artinya bisa bertambah dan berkurang kapanpun sesuai kebutuhan. -Vector sangat mirip seperti array, yang karakteristiknya adalah tipe data elemen wajib sama, punya informasi size, elemen-nya bisa diakses atau diubah. Salah satu perbedaan vector dibanding array adalah jumlah elemen pada vector bisa bertambah lebih dari kapasitas yang sudah ditentukan. +Vector sangat mirip seperti array, yang karakteristiknya adalah tipe data elemen wajib sama, punya informasi size, elemennya bisa diakses atau diubah. Salah satu perbedaan vector dibanding array adalah jumlah elemen pada vector bisa bertambah lebih dari kapasitas yang sudah ditentukan. Vector memiliki 3 buah atribut yg penting untuk diketahui: diff --git a/docs/basic/visibility-privacy.md b/docs/basic/visibility-privacy.md index c759e0aa..ba505b52 100644 --- a/docs/basic/visibility-privacy.md +++ b/docs/basic/visibility-privacy.md @@ -8,7 +8,7 @@ Kita sebenarnya sudah mempelajari banyak hal yang berhubungan dengan visibility Chapter ini merupakan pembahasan tambahan untuk ke-4 keyword tersebut, dan fokusnya lebih ke visibility & privacy di Rust secara general. -O iya, perihal *visbility* dan *privacy* itu sendiri, kedua istilah tersebut di sini kita maknai sama, yang artinya kurang lebih adalah tentang manajemen akses item di Rust. +O iya, perihal *visibility* dan *privacy* itu sendiri, kedua istilah tersebut di sini kita maknai sama, yang artinya kurang lebih adalah tentang manajemen akses item di Rust. ## A.28.1. Pembahasan module system @@ -29,7 +29,7 @@ Di Rust, *by default*, hampir semua item adalah private. Apa efeknya ketika item > Kita sepakati di sini, pada istilah **current module** kata *module* di situ bisa saja tertuju untuk module atau juga submodule -Dua point di atas sangat penting untuk dipahami, karena digunakan sebagai landasan pertimbangan dalam penyusunan hirarki module. Sebagai contoh, kita bisa membuat program yang hanya meng-expose API tertentu (yang memang diperlukan untuk diakses oleh publik), tanpa perlu ikut meng-expose detail implementasinya. +Dua point di atas sangat penting untuk dipahami, karena digunakan sebagai landasan pertimbangan dalam penyusunan hierarki module. Sebagai contoh, kita bisa membuat program yang hanya meng-expose API tertentu (yang memang diperlukan untuk diakses oleh publik), tanpa perlu ikut meng-expose detail implementasinya. Ok, sekarang silakan perhatikan path sederhana di bawah ini. Diasumsikan ada sebuah fungsi yang path aksesnya adalah berikut: @@ -118,7 +118,7 @@ Pada praktik selanjutnya ini kita misalkan bahwa fungsi `say_hello` isinya meman 2. Atau, hapus saja fungsi `say_hello`, lalu ubah visibility module `service_layer` menjadi publik, dengan demikian kita bisa mengakses `some_black_magic` dari `main` menggunakan path `messaging::service_layer::some_black_magic`. 3. Atau, gunakan teknik **re-export item**. -Re-export item adalah sebuah cara untuk mem-*bypass* pengaksesan item yang secara hirarki memang tidak bisa diakses dari luar module (bisa jadi karena visibility item ataupun parent module nya adalah private). Dengan teknik ini, maka item pasti bisa diakses dari luar module. +Re-export item adalah sebuah cara untuk mem-*bypass* pengaksesan item yang secara hierarki memang tidak bisa diakses dari luar module (bisa jadi karena visibility item ataupun parent module nya adalah private). Dengan teknik ini, maka item pasti bisa diakses dari luar module. Item yang di-re-export akan menjadi item milik *current module* di mana statement re-export tersebut ditulis.