Skip to content

Commit

Permalink
fix: several typographical and grammatical errors (#103)
Browse files Browse the repository at this point in the history
* fix: several typos on words and number

* fix: use standard words based on KBBI

* fix: grammar errors on preposition "di"

---------

Co-authored-by: Noval Agung Prayogo <hello@novalagung.com>
  • Loading branch information
sultanfariz and novalagung authored Dec 14, 2024
1 parent a62c01f commit 8eb86af
Show file tree
Hide file tree
Showing 28 changed files with 49 additions and 48 deletions.
4 changes: 2 additions & 2 deletions docs-wip/recoverable-error-handling.md
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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) {
Expand Down
1 change: 1 addition & 0 deletions docs/CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -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 :-)
Expand Down
10 changes: 5 additions & 5 deletions docs/basic/advanced-traits.md
Original file line number Diff line number Diff line change
Expand Up @@ -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`

Expand Down Expand Up @@ -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:

Expand All @@ -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
Expand Down Expand Up @@ -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 {
Expand Down Expand Up @@ -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).

Expand Down
6 changes: 3 additions & 3 deletions docs/basic/array.md
Original file line number Diff line number Diff line change
Expand Up @@ -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`

Expand All @@ -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 `{:?}`

Expand Down
2 changes: 1 addition & 1 deletion docs/basic/attributes.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
6 changes: 3 additions & 3 deletions docs/basic/closures.md
Original file line number Diff line number Diff line change
Expand Up @@ -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 (`{}`).

Expand Down Expand Up @@ -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

Expand Down Expand Up @@ -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.

Expand Down
4 changes: 2 additions & 2 deletions docs/basic/datetime.md
Original file line number Diff line number Diff line change
Expand Up @@ -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::*;
Expand Down Expand Up @@ -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;
Expand Down
2 changes: 1 addition & 1 deletion docs/basic/generics.md
Original file line number Diff line number Diff line change
Expand Up @@ -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 `<T>`. 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<i32>`, `Vec<&str>`, dll. Kita juga sempat sedikit belajar tentang topik generic pada chapter [Traits](/basic/traits).

Expand Down
2 changes: 1 addition & 1 deletion docs/basic/komentar.md
Original file line number Diff line number Diff line change
Expand Up @@ -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");
}
```
Expand Down
4 changes: 2 additions & 2 deletions docs/basic/konstanta.md
Original file line number Diff line number Diff line change
Expand Up @@ -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`.

Expand Down
6 changes: 3 additions & 3 deletions docs/basic/lifetime.md
Original file line number Diff line number Diff line change
Expand Up @@ -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.

Expand Down Expand Up @@ -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.
Expand Down
6 changes: 3 additions & 3 deletions docs/basic/module-basic.md
Original file line number Diff line number Diff line change
Expand Up @@ -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*.

Expand All @@ -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`

Expand Down Expand Up @@ -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.

Expand Down
2 changes: 1 addition & 1 deletion docs/basic/module-inline.md
Original file line number Diff line number Diff line change
Expand Up @@ -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`.

Expand Down
2 changes: 1 addition & 1 deletion docs/basic/operator-tanda-tanya.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ Penggunaannya terhadap tipe data `Result<T, E>` 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.

Expand Down
2 changes: 1 addition & 1 deletion docs/basic/ownership.md
Original file line number Diff line number Diff line change
Expand Up @@ -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 ManagementHeap 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 ManagementHeap 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**.

Expand Down
Loading

0 comments on commit 8eb86af

Please sign in to comment.