Pendahuluan
Tebak angka atau guessing game merupakan proyek pertama (latihan) untuk seseorang yang belajar dengan bahasa Rust, bersumber dari Rust: The Book. Rust adalah bahasa pemrograman yang diperkenalkan pada tahun 2010 oleh tim Mozilla, berfokus pada keamanan dan performa. Dapat digunakan untuk membangun OS seperti Redox Os, machine learning, web server, dsb.
Awalnya saya sempat menggunakan bahasa Python dan membuat beberapa program untuk membantu proses perkuliahan. Lalu lebih memilih Rust, kenapa ya?
- Rust sangat menantang karena penggunaan syntax lebih kompleks.
- Dapat digunakan untuk membangun blockchain contohnya Solana.
- Skala penggunaan lebih luas dan kompleks.
- Performa yang lebih baik karena efisiensi pemanfaatan memori.
Contoh kasus
Seorang programer diberikan tugas untuk membuat program input umur pasien rumah sakit. Kemudian dia menulis program dengan menggunakan dua bahasa, python dan rust.
Penulisan Kode Python
variabel = input("Berapa umurmu?")
print(variabel)
Penulisan Kode Rust
use std::io;
fn main () {
println!("Berapa umurmu?");
let mut variabel = String::new ();
io::stdin ()
.read_line(&mut variabel);
.expect("Error, mohon masukan angka");
println!("{variabel}";
}
Rust mengharuskan penggunaan kode yang jelas sehingga menambah variabilitas syntax sedangkan Python lebih sederhana. Ilustrasi berikut dapat membedakan antara rust dan python.
Perbedaan python dan rust
Python: Saya pergi ke bali menggunakan jalan tol.
Rust: Saya pergi ke bali menggunakan mobil pribadi atau kendaraan umum melewati jalan tol.
Kalimat tersebut sebenarnya sama saja. Tetapi rust lebih jelas dan rinci. Sedangkan python menggandung makna tersirat, jalan tol pastilah hanya untuk mobil dan kendaraan umum. Maka dari itu tidak perlu dituliskan agar lebih singkat.
Berdasarkan pengalaman pribadi ketika belajar bahasa Rust, dukungan komunitas serta resource yang disediakan cukup lengkap. Pada docs rust kita akan membuat sebuah program tebak angka (project based learning).
Game tebak angka secara singkat adalah game dimana pemain bertugas menebak angka yang akan keluar dalam interval 1-15. Jika benar berarti anda pemenangnya.
Saya akan menjelaskan kembali setiap line code game tebak angka dalam bahasa rust sebagai cara untuk belajar dan recall materi yang telah dipelajari dalam The Books. Penjelasan akan dibagi per-section.
Penjelasan
Bagian 1
use std::io; //input
use std::cmp::Ordering; //compare
use rand::Rng; //random generator
Terdapat penggunaan syntax “use std::io” yang merupakan tanda penggunaan crates nama linrary pada rust atau kumpulan kode reusable. Hal ini meningkatkan efisiensi karena mirip sebuah add-on dimana tidak perlu menulis kode dari awal, cukup gunakan karya orang lain.
- use std::io adalah crates yang diperlukan untuk proses input data.
- use std::cmp::Ordering adalah crates untuk melakukan pencocokan/komparasi tebakan angka yang dimasukan pemain dengan jawaban.
- use rand::Rng adalah crates yang berfungsi memberikan angka acak dari 1-15 untuk ditebak oleh pemain.
Bagian 2
fn main () {
println!("Guess the number");
let secret_number = rand::thread_rng()
.gen_range(1..= 15);
- fn main () adalah kode yang pasti ada pada setiap program rust dan parentesis “( )” merupakan parameter. Sebagai awal dari sebuah kode (fungsi utama)
- Kurung kurawal “{ }” berisi kode program yang kita tulis. “{” menandakan awal dari fungsi dan “}” adalah akhir atau penutup.
- println! adalah kode yang akan menampilkan tulisan pada layar dalam parentesis “( )“. Guess the number adalah isi dari parameter yang akan ditampilkan sebagai sebuah text.
- Pada bagian akhir sebuah ekspresi terdapat semicolon “;” untuk penanda bahwa ekspresi tersebut selesai pada baris tersebut.
- let secret_number, “let” berfungsi untuk membuat variabel dengan nama secret_number yang memuat code rand::thread_rng() .gen_range(1..= 15);.
- rand::thread_rng() adalah crates yang digunakan dari rand berupa thread_rng.
- .gen_range(1..= 15); adalah kode yang akan memunculkan angka acak dari 1 – 15. Fitur ini berasal dari rand::thread_rng().
Bagian 3
loop {
println!("Please input your guess: ");
let mut guess= String::new();
io::stdin()
.read_line(&mut guess)
.expect("Failed to read line");
- loop adalah kode yang digunakan agar program dijalankan secara berulang setelah pemain menebak angka tetapi salah. Sehingga dapat menebak terus sampai benar.
- let mut guess adalah variabel bernama guess. mut berarti mutable atau dapat dirubah.
- String::new(); adalah kode yang akan memberikan sebuah ruangan kosong untuk huruf pada variabel guess.
- io::stdin() adalah kode yang bertugas untuk menangkap tebakan angka user menggunakan metode .read_line(&mut guess) lalu merubahnya berdasarkan standar input, terakhir memasukannya pada variabel guess.
- .expect(“Failed to read line”); adalah kode yang ditulis untuk memberikan respon terhadap input. Jika tidak maka akan muncul tulisan (“Failed to read line”).
Bagian 4
let guess: u32 = match guess.trim().parse(){
Ok(num) => num,
Err(_) => continue,
- let guess: u32 = match guess.trim().parse() adalah variabel bayangan untuk merubah input user yang asalnya berupa string menjadi angka (unsigned 32).
.trim()akan menghapus spasi atau enter dari user saat memasukan angka. dari 5/n menjadi 5.- .parse() akan merubah 5 yang tadinya merupakan string menjadi u32 atau angka.
- match adalah kode yang digunakan untuk mencocokan hasil dari program.
- Err(_) => continue akan terpilih sehingga program tidak akan crash atau berhenti. User diberikan kesempatan untuk menebak kembali menggunakan angka.
- Underscore “(_)” digunakan sebagai catch call untuk menangkap informasi error. Sehingga program akan dilanjutkan tanpa crash.
- Ok(num) => num, akan digunakan jika user memasukan angka (benar). Sehingga akan dilakukan komparasi lanjutan.
Bagian 5
println!("You guessed: {guess}");
match guess.cmp(&secret_number) {
Ordering::Less => println!("Too small!"),
Ordering::Greater => println!("Too big!"),
Ordering::Equal => {
println!("You win!");
break;
- println!(“You guessed: {guess}”); adalah kode yang digunakan untuk menampilkan tulisan “You guessed: 5“.
- {guess} adalah variabel yang menampilkan angka pilihan dari user.
- match guess.cmp(&secret_number) digunakan untuk melakukan komparasi tebakan angka user dengan jawaban.
- guess.cmp(&secret_number) artinya variabel guess akan bandingkan dengan variabel secret_number.
- Ordering::Less => println!(“Too small!”) digunakan jika tebakan user terlalu rendah dari jawaban, komputer akan menampilkan teks “Too smal”. Artinya user harus menaikan angka tebakan agar lebih dekat pada jawaban.
- Ordering::Greater => println!(“Too big!”) digunakan jika tebakan user terlalu besar. Maka user perlu memperkecil angka.
- Ordering::Equal => { println!(“You win!”);} jika tebakan user (variabel guess) sama dengan (secret_number) komputer akan menampinkan teks you win.
- break; adalah kode yang berada satu jangkar dengan Ordering::Equal. Jika tebakan user benar proses loop akan berhenti sehingga program juga akan “break” atau berhenti.
Full Code
Jika bagian dari 1-5 disatukan maka akan menjadi kode program penuh seperti di bawah ini. Masing-masing kode terintegrasi satu sama lain untuk menjalankan fungsinya.
use std::io; //input
use std::cmp::Ordering; //compare
use rand::Rng; //random generator
fn main () {
println!("Guess the number");
let secret_number = rand::thread_rng()
.gen_range(1..= 15);
loop {
println!("Please input your guess: ");
let mut guess= String::new();
io::stdin()
.read_line(&mut guess)
.expect("Failed to read line");
let guess: u32 = match guess.trim().parse(){
Ok(num) => num,
Err(_) => continue,
};
println!("You guessed: {guess}");