Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix(grammar): typo on "di atas" phrase #14

Merged
merged 3 commits into from
Dec 28, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 6 additions & 6 deletions docs/basic/array.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ Array (atau *fixed size array*) adalah kumpulan data dengan tipe sejenis, disimp

Ada beberapa notasi deklarasi array yang bisa dipakai, kesemuanya akan dibahas pada chapter ini.

Ok, Sekarang kita mulai praktek dengan bermain-main terlebih dahulu dengan tipe data array ini. Silakan pelajari dan praktekan contoh berikut, sebuah program yang isinya menampilkan data array.
Ok, Sekarang kita mulai praktik dengan bermain-main terlebih dahulu dengan tipe data array ini. Silakan pelajari dan praktikkan contoh berikut, sebuah program yang isinya menampilkan data array.

```rust
let mut numbers = [24, 12, 32, 7];
Expand Down Expand Up @@ -94,7 +94,7 @@ Array hanya bisa diakses elemennya sesuai size saat deklarasi. Sebagai contoh, v

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 merubah value elemen array dengan value baru bertipe data sama.

Bisa dilihat pada contoh yang sudah dipraktekan, elemen indeks ke-1 diubah nilainya menjadi `16`, dan elemen indeks ke-3 value-nya menjadi `8`
Bisa dilihat pada contoh yang sudah dipraktikkan, elemen indeks ke-1 diubah nilainya menjadi `16`, dan elemen indeks ke-3 value-nya menjadi `8`

```rust
numbers[1] = 16;
Expand Down Expand Up @@ -126,7 +126,7 @@ println!("array {numbers:?}");

## A.13.2. Notasi penulisan tipe data array

Pada contoh program yang sudah dipraktekan, variabel `number` tipe datanya adalah array numerik, terlihat saat deklarasinya *predefined value* diisi dengan literal elemen array bertipe `i32`.
Pada contoh program yang sudah dipraktikkan, variabel `number` tipe datanya adalah array numerik, terlihat saat deklarasinya *predefined value* diisi dengan literal elemen array bertipe `i32`.

Tipe data `i32` di sini adalah milik elemen array, sedang array `numbers` itu sendiri tipe datanya adalah `[i32; 4]`, yang artinya adalah **sebuah array dengan elemen bertipe `i32` dengan size `4`**.

Expand Down Expand Up @@ -259,9 +259,9 @@ Iterasi array menggunakan `while` dan `loop` umumnya kurang praktis jika dibandi

## A.13.7. Iterasi array menggunakan `for in` dan *tuple*

Mengiterasi value sekaligus *counter* perulangan sebenarnya bisa juga dilakukan menggunakan `for in`, contohnya seperti yang sudah kita praktekan di atas yaitu `for i in 0..names.len()`.
Mengiterasi value sekaligus *counter* perulangan sebenarnya bisa juga dilakukan menggunakan `for in`, contohnya seperti yang sudah kita praktikkan di atas yaitu `for i in 0..names.len()`.

Ada juga bentuk lain pemanfaatan `for in` untuk mengiterasi sebuah array. Caranya dengan menggunakan teknik tuple untuk menampung data *counter* sekaligus value tiap elemen. Lebih jelasnya silakan lihat dan praktekan contoh berikut:
Ada juga bentuk lain pemanfaatan `for in` untuk mengiterasi sebuah array. Caranya dengan menggunakan teknik tuple untuk menampung data *counter* sekaligus value tiap elemen. Lebih jelasnya silakan lihat dan praktikkan contoh berikut:

```rust
let names: [&str; 4] = ["jason", "grayon", "drake", "damian"];
Expand Down Expand Up @@ -315,7 +315,7 @@ Variabel `data_arr` pada contoh di atas bertipe data`[[&str; 2] 3]`, yang artiny

## Catatan chapter 📑

### ◉ Source code praktek
### ◉ Source code praktik

<pre>
<a href="https://github.com/novalagung/dasarpemrogramanrust-example/tree/master/array">
Expand Down
12 changes: 6 additions & 6 deletions docs/basic/associated-function.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ Fungsi yang terhubung dengan suatu struct atau trait disebut dengan *associated
> - Lebih jelasnya mengenai trait dibahas pada chapter [Traits](/basic/traits)
> - Lebih jelasnya mengenai macam-macam item dibahas pada chapter [Path & Item](/basic/path-item#a183-rust-items)

Ok, mari kita lanjut ke bagian praktek. Silakan tulis kode berikut terlebih dahulu.
Ok, mari kita lanjut ke bagian praktik. Silakan tulis kode berikut terlebih dahulu.

```rust
#[derive(Debug)]
Expand Down Expand Up @@ -69,7 +69,7 @@ impl LegoSet {
}
```

Notasi penulisan keyword `impl` bisa dilihat pada contoh diatas, cukup tulis saja keyword tersebut diikuti nama struct yang diinginkan, kemudian diikuti dengan blok kode berisi definisi fungsi.
Notasi penulisan keyword `impl` bisa dilihat pada contoh di atas, cukup tulis saja keyword tersebut diikuti nama struct yang diinginkan, kemudian diikuti dengan blok kode berisi definisi fungsi.

Fungsi dalam blok kode `impl` adalah yang disebut dengan *associated function*. Pada contoh di atas, fungsi `new` memiliki asosiasi dengan struct `LegoSet`.

Expand Down Expand Up @@ -172,7 +172,7 @@ Tipe data `Self` (perhatikan huruf `S`-nya adalah kapital) merupakan representas

> Tipe data `Self` hanya bisa digunakan dalam blok kode `impl`

Sebagai contoh, pada kode yang sudah dipraktekan, keyword `impl` diterapkan dalam pembuatan *associated items* untuk struct `LegoSet`. Dalam blok kode tersebut, tipe data `LegoSet` bisa diganti dengan `Self`.
Sebagai contoh, pada kode yang sudah dipraktikkan, keyword `impl` diterapkan dalam pembuatan *associated items* untuk struct `LegoSet`. Dalam blok kode tersebut, tipe data `LegoSet` bisa diganti dengan `Self`.

Silakan lihat contoh dibawah ini, ada 4 buah cara deklarasi fungsi `new` yang kesemuanya adalah ekuivalen.

Expand Down Expand Up @@ -212,7 +212,7 @@ impl LegoSet {

Struct adalah salah satu dari beberapa item yang ada di Rust. Struct bisa saja berada dalam sebuah module, baik inline maupun *normal* module.

Sekarang, kode yang sudah dipraktekan 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`.
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`.

Kurang lebih struktur package mendi seperti ini:

Expand Down Expand Up @@ -319,7 +319,7 @@ Hmm, ada yang aneh, karena suatu alasan statement `model::Color` dianggap error.

![Associated function](img/associated-function-5.png)

Error ini sebenarnya mirip dengan error praktek sebelumnya, ketika mencoba membuat object baru dari struct sedangkan property struct tersebut adalah private.
Error ini sebenarnya mirip dengan error praktik sebelumnya, ketika mencoba membuat object baru dari struct sedangkan property struct tersebut adalah private.

Pada kasus struct, solusinya cukup dengan tambahkan keyword `pub` atau siapkan *associated function* untuk pembuatan object. Pada tuple struct, solusinya juga mirip, ada dua opsi yang bisa dipilih.

Expand Down Expand Up @@ -362,7 +362,7 @@ Pada kasus struct, solusinya cukup dengan tambahkan keyword `pub` atau siapkan *

## Catatan chapter 📑

### ◉ Source code praktek
### ◉ Source code praktik

<pre>
<a href="https://github.com/novalagung/dasarpemrogramanrust-example/tree/master/associated_function">
Expand Down
4 changes: 2 additions & 2 deletions docs/basic/basic-memory-management.md
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,7 @@ Data untuk tipe primitif (seperti `i32`, `bool`, dll) disimpan di stack.

### ◉ Contoh ke-1

Selanjutnya kita akan pelajari secara garis besar tentang bagaimana sebuah data dialokasikan di stack. Silakan mulai dengan mempelajari kode sederhana berikut (tanpa perlu dipraktekan), kemudian ikuti pembahasan setelahnya.
Selanjutnya kita akan pelajari secara garis besar tentang bagaimana sebuah data dialokasikan di stack. Silakan mulai dengan mempelajari kode sederhana berikut (tanpa perlu dipraktikkan), kemudian ikuti pembahasan setelahnya.

```rust
fn main() {
Expand Down Expand Up @@ -218,7 +218,7 @@ Nantinya akan dibahas juga tentang beberapa error saat compile time yang error t

## Catatan chapter 📑

### ◉ Source code praktek
### ◉ Source code praktik

<pre>
<a href="https://github.com/novalagung/dasarpemrogramanrust-example/tree/master/memory_management">
Expand Down
4 changes: 2 additions & 2 deletions docs/basic/block-expression.md
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ let varTwo: tipeData = {

Dalam block expression, tidak perlu menuliskan keyword `return` dan tidak perlu juga menuliskan tanda semicolon di akhir statement return value.

Berikut adalah contoh praktek return value block. Ada sebuah block yang nilai baliknya ditampung ke variabel `a`. Isi block sendiri adalah generate data numerik random, yang kemudian dikalikan dengan angka `2`, lalu dijadikan return value.
Berikut adalah contoh praktik return value block. Ada sebuah block yang nilai baliknya ditampung ke variabel `a`. Isi block sendiri adalah generate data numerik random, yang kemudian dikalikan dengan angka `2`, lalu dijadikan return value.

```rust
use rand::Rng;
Expand Down Expand Up @@ -175,7 +175,7 @@ Rust menerapkan konsep memory management bernama **ownership**. Setiap kali Rust

## Catatan chapter 📑

### ◉ Source code praktek
### ◉ Source code praktik

<pre>
<a href="https://github.com/novalagung/dasarpemrogramanrust-example/tree/master/block_expression">
Expand Down
6 changes: 3 additions & 3 deletions docs/basic/borrowing.md
Original file line number Diff line number Diff line change
Expand Up @@ -148,7 +148,7 @@ Jadi sampai sini cukup jelas ya. Sebuah data dalam waktu yang sama hanya diperbo

Kita telah belajar tentang [valid/invalid variable dan juga variable scope](/basic/ownership#a333-variable-scope) pada chapter sebelumnya. Sekarang kita akan coba gabungkan dua aspek tersebut dengan borrowing.

Silakan praktekan kode berikut:
Silakan praktikkan kode berikut:

```rust
fn main() {
Expand Down Expand Up @@ -193,7 +193,7 @@ Kita sudah cukup paham kapan waktu terjadinya alokasi alamat memory dan juga kap

Scope di sini adalah variable scope, yang maksudnya adalah block scope, bisa berupa block expression, fungsi, block seleksi kondisi `if`, dan juga jenis block lainnya.

Ok, sekarang mari kita praktekan beberapa jenis block untuk isolasi operasi borrowing. Dengan ini maka klausul **dalam satu waktu** akan terpenuhi.
Ok, sekarang mari kita praktikkan beberapa jenis block untuk isolasi operasi borrowing. Dengan ini maka klausul **dalam satu waktu** akan terpenuhi.

Silakan modifikasi program sebelumnya menjadi seperti berikut:

Expand Down Expand Up @@ -307,7 +307,7 @@ Lebih jelasnya mengenai macro dibahas pada chapter [Macro](/wip/macro).

## Catatan chapter 📑

### ◉ Source code praktek
### ◉ Source code praktik

<pre>
<a href="https://github.com/novalagung/dasarpemrogramanrust-example/tree/master/borrowing">
Expand Down
8 changes: 4 additions & 4 deletions docs/basic/closures.md
Original file line number Diff line number Diff line change
Expand Up @@ -283,7 +283,7 @@ Sedangkan fungsi `do_something` sendiri juga menampilkan pesan string lainnya, y

### ◉ Praktek ke-2

Pada contoh di atas, closure yang dikembalikan fungsi memiliki skema sangat sederhana, tanpa parameter dan argument. Mari coba praktek dengan contoh yang lebih kompleks.
Pada contoh di atas, closure yang dikembalikan fungsi memiliki skema sangat sederhana, tanpa parameter dan argument. Mari coba praktik dengan contoh yang lebih kompleks.

```rust
fn do_something_v2() -> impl Fn(i32, String) -> String {
Expand Down Expand Up @@ -353,9 +353,9 @@ run_x_times(4, |i: i32| println!("hello rust {i}"));

### ◉ Praktek ke-2

Ok, sekarang mari kita coba praktekan contoh yang lebih kompleks.
Ok, sekarang mari kita coba praktikkan contoh yang lebih kompleks.

Pada praktek ini kita akan buat sebuah fungsi yang tugasnya melakukan pencarian indeks slice dengan kondisi pencarian didapat dari eksekusi closure.
Pada praktik ini kita akan buat sebuah fungsi yang tugasnya melakukan pencarian indeks slice dengan kondisi pencarian didapat dari eksekusi closure.

```rust
fn find_index<T, F>(data: &[T], cond_fn: F) -> i32
Expand Down Expand Up @@ -410,7 +410,7 @@ Bisa dilihat program berjalan sesuai harapan.

## Catatan chapter 📑

### ◉ Source code praktek
### ◉ Source code praktik

<pre>
<a href="https://github.com/novalagung/dasarpemrogramanrust-example/tree/master/closures">
Expand Down
6 changes: 3 additions & 3 deletions docs/basic/enum.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ enum NamaEnum {

`NamaEnum` di atas adalah tipe data custom yang didefinisikan bertipe enum. Sedangkan `NilaiEnum1`, `Nilai2`, dan `NilaiEnumKe3` adalah yang disebut dengan enum value. Dengan itu maka ketiga enum values tersebut tipe datanya adalah sama, yaitu `NamaEnum`.

Mari kita lanjut praktek. Berikut ini adalah definisi konstanta yang menggunakan tipe data string untuk menampung nilai konstan-nya. Lalu dibawahnya ada lagi definisi nilai konstan tetapi menggunakan enum sebagai tipe data yang digunakan.
Mari kita lanjut praktik. Berikut ini adalah definisi konstanta yang menggunakan tipe data string untuk menampung nilai konstan-nya. Lalu dibawahnya ada lagi definisi nilai konstan tetapi menggunakan enum sebagai tipe data yang digunakan.

```rust
// definisi konstanta
Expand Down Expand Up @@ -106,7 +106,7 @@ Lalu bagaimana cara pengaplikasian seleksi kondisi pada tipe enum? Caranya adala

`match` adalah salah satu keyword untuk operasi seleksi kondisi di Rust. Penerapan keyword ini cukup luas, namun pada chapter ini hanya akan dibahas penerapannya yang relevan dengan topik enum.

Mari kita pelajarinya sembari praktek. Silakan buat package baru, lalu definisikan tipe enum `Food` berikut beserta 4 enum value-nya.
Mari kita pelajarinya sembari praktik. Silakan buat package baru, lalu definisikan tipe enum `Food` berikut beserta 4 enum value-nya.

```rust
enum Food {
Expand Down Expand Up @@ -400,7 +400,7 @@ Pembahasan yang lebih mendetail tentang keyword `match` dan *pattern matching* a

## Catatan chapter 📑

### ◉ Source code praktek
### ◉ Source code praktik

<pre>
<a href="https://github.com/novalagung/dasarpemrogramanrust-example/tree/master/enum">
Expand Down
14 changes: 7 additions & 7 deletions docs/basic/function.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ Pada chapter ini kita akan belajar tentang *function* atau fungsi.

## A.17.1. Keyword `fn`

Fungsi di Rust dibuat menggunakan keyword `fn`. Salah satu contoh penerapan keyword ini dalam pembuatan fungsi sudah kita praktekan berulang kali pada definisi fungsi `main`, yang merupakan fungsi utama atau entrypoint sebuah program.
Fungsi di Rust dibuat menggunakan keyword `fn`. Salah satu contoh penerapan keyword ini dalam pembuatan fungsi sudah kita praktikkan berulang kali pada definisi fungsi `main`, yang merupakan fungsi utama atau entrypoint sebuah program.

```rust
fn main() {
Expand Down Expand Up @@ -91,7 +91,7 @@ fn func_name(param_a: int32, param_b: bool, param_c: &str) {
// ...
```

Kembali ke praktek, pada bagian ini kita akan buat sebuah fungsi bernama `greet_custom_message`. Fungsi ini tugasnya masih sama seperti seperti `greet` hanya saja pesan yang ditampilkan adalah sesuai dengan value parameter fungsi.
Kembali ke praktik, pada bagian ini kita akan buat sebuah fungsi bernama `greet_custom_message`. Fungsi ini tugasnya masih sama seperti seperti `greet` hanya saja pesan yang ditampilkan adalah sesuai dengan value parameter fungsi.

```rust
fn greet_custom_message(name: &str, message: &str) {
Expand Down Expand Up @@ -156,7 +156,7 @@ Jalankan program, hasilnya adalah sesuai harapan. Volume dari persegi panjang de

### ◉ Keyword `return` untuk penentuan nilai balik

Salah satu hal yang unik yang ada di Rust adalah beberapa variasi cara penulisan nilai balik fungsi. Cara pertama adalah menggunakan keyword `return` seperti yang sudah dipraktekan.
Salah satu hal yang unik yang ada di Rust adalah beberapa variasi cara penulisan nilai balik fungsi. Cara pertama adalah menggunakan keyword `return` seperti yang sudah dipraktikkan.

```rust
fn calculate_box_volume1(width: i32, height: i32, length: i32) -> i32 {
Expand All @@ -169,7 +169,7 @@ Untuk cara ini penulis rasa cukup jelas.

### ◉ *Return value* tanpa keyword `return`

Cara ke-2 kita langsung praktekan menggunakan kode berikut, silakan tulis lalu jalankan program:
Cara ke-2 kita langsung praktikkan menggunakan kode berikut, silakan tulis lalu jalankan program:

```rust
fn calculate_box_volume2(width: i32, height: i32, length: i32) -> i32 {
Expand Down Expand Up @@ -201,7 +201,7 @@ Kedua poin tersebut merupakan syarat untuk penerapan *return value* tanpa keywor

Cara selanjutnya yang akan kita bahas ini sebenarnya sama seperti sebelumnya, hanya saja bedanya di sini tidak menggunakan nama variabel sebagai nilai balik, melainkan langsung statement, yang hasil eksekusi statement tersebut dijadikan nilai balik fungsi.

Langsung saja kita praktekan. Siapkan fungsi `calculate_box_volume3` berikut:
Langsung saja kita praktikkan. Siapkan fungsi `calculate_box_volume3` berikut:

```rust
fn calculate_box_volume3(width: i32, height: i32, length: i32) -> i32 {
Expand Down Expand Up @@ -230,7 +230,7 @@ Bisa dilihat hasilnya sama seperti pada program sebelumnya.

### ◉ Macro `format` untuk membuat *formatted* string

Bagian ini adalah penjelasan tambahan dari kode program yang baru saja dipraktekan.
Bagian ini adalah penjelasan tambahan dari kode program yang baru saja dipraktikkan.

Macro `format` digunakan untuk *formatting* sebuah string. *Formatting* di sini maksudnya adalah pembuatan string dengan menggunakan teknik penyusunan isi string dalam format tertentu, mirip seperti yang dilakukan menggunakan macro `print` atau `println`, bedanya hanya pada macro `format` hasilnya bukan sebuah output ke console output, melainkan sebagai nilai balik.

Expand Down Expand Up @@ -320,7 +320,7 @@ Untuk sekarang silakan lanjut ke pembahasan chapter berikutnya terlebih dahulu,

## Catatan chapter 📑

### ◉ Source code praktek
### ◉ Source code praktik

<pre>
<a href="https://github.com/novalagung/dasarpemrogramanrust-example/tree/master/function">
Expand Down
6 changes: 3 additions & 3 deletions docs/basic/generics.md
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ Tipe `R` digunakan sebagai tipe parameter `arg1` dan tipe `T` pada parameter `ar

## A.37.2. Mengasosiasikan traits ke parameter generic

Fungsi `do_something` yang telah dipraktekan, susah untuk diisi dengan apapun. Memang parameter `arg1` tipe-nya adalah `i32`, dan harusnya mudah untuk bermain-main dengan parameter tersebut. Yang agak repot adalah parameter ke-2, yaitu `arg2` yang bertipe `T`.
Fungsi `do_something` yang telah dipraktikkan, susah untuk diisi dengan apapun. Memang parameter `arg1` tipe-nya adalah `i32`, dan harusnya mudah untuk bermain-main dengan parameter tersebut. Yang agak repot adalah parameter ke-2, yaitu `arg2` yang bertipe `T`.

```rust
fn do_something<T>(arg1: i32, arg2: T) {
Expand Down Expand Up @@ -266,7 +266,7 @@ impl<T> Square<T> {
>
> Jika tidak sama akan muncul error.

Ok, sekarang mari kita praktekan. Struct `Point` yang sudah dibuat, kita siapkan method-nya. Ada 3 buah method yang akan dibuat dan kesemuanya adalah method *getter* untuk masing-masing property struct (yaitu `x`, `y`, dan `z`).
Ok, sekarang mari kita praktikkan. Struct `Point` yang sudah dibuat, kita siapkan method-nya. Ada 3 buah method yang akan dibuat dan kesemuanya adalah method *getter* untuk masing-masing property struct (yaitu `x`, `y`, dan `z`).

```rust
struct Point<T, U> {
Expand Down Expand Up @@ -380,7 +380,7 @@ let kendaraan3 = Kendaraan::<&str>::Gledekan("Artco");

## Catatan chapter 📑

### ◉ Source code praktek
### ◉ Source code praktik

<pre>
<a href="https://github.com/novalagung/dasarpemrogramanrust-example/tree/master/generics">
Expand Down
2 changes: 1 addition & 1 deletion docs/basic/hello-rust.md
Original file line number Diff line number Diff line change
Expand Up @@ -137,7 +137,7 @@ Selamat! Anda telah menjadi programmer Rust!

## Catatan chapter 📑

### ◉ Source code praktek
### ◉ Source code praktik

<pre>
<a href="https://github.com/novalagung/dasarpemrogramanrust-example/tree/master/hello_rust">
Expand Down
2 changes: 1 addition & 1 deletion docs/basic/komentar.md
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ Bisa dilihat, komentar tidak menghasilkan efek apa-apa pada program yang dibuat.

## Catatan chapter 📑

### ◉ Source code praktek
### ◉ Source code praktik

<pre>
<a href="https://github.com/novalagung/dasarpemrogramanrust-example/tree/master/komentar">
Expand Down
2 changes: 1 addition & 1 deletion docs/basic/konstanta.md
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ Sesuai anjuran di [halaman dokumentasi Rust](https://rust-lang.github.io/api-gui

## Catatan chapter 📑

### ◉ Source code praktek
### ◉ Source code praktik

<pre>
<a href="https://github.com/novalagung/dasarpemrogramanrust-example/tree/master/konstanta">
Expand Down
Loading