Tipe Data Scalar dan Compound Pada Rust

Pendahuluan

Setelah membahas mengenai tipe variabel, kali ini dilanjutan dengan ragam jenis data yang bisa disimpan dalam variabel. Tentunya dalam menunjunag kehidupan sehari-hari kita sering berhubungan dengan banyak data, contohnya data kependudukan, data hasil penelitian, dan data keuangan.

Pada bahasa pemrograman, data diklasifikasikan sesuai fungsinya. Tujuannya agar program menjadi lebih efisien karena compiler langsung mengetahui tipe data dan bagaimana cara memperlakukan data tersebut.

Format Penulisan

fn main () {

  let harga_roti_aoka: u32 = 2000;
}

Rust termasuk bahasa pemrograman statis, artinya penulisan kode harus menyertakan tipe data (eksplisit).

  • let digunakan untuk menghubungkan variabel dengan nama harga_roti_aoka dengan konstanta (nilai).
  • titik dua “:” mendeklarasikan tipe data, yaitu u32 (unsigned 32-bit).
  • =” menunjukan nilai variabel, yaitu 2.000.
  • Semicolon “;” digunakan sebagai akhiran.

Scalar

Scalar adalah tipe data yang hanya memiliki satu nilai per variabel. Rust memiliki empat jenis scalar, yaitu integer, floating-point, boolean, dan character.

Integer

Integer adalah data numerik yang bersifat utuh atau tanpa desimal. Integer dibagi menjadi beberapa kelompok seperti yang ditunjukan oleh tabel 1.0:

Tabel 1.0 sebaran jenis integer

SignedUnsignedRange (signed)
i8u8-128 sampai 127
i16u16-(216 – 1) to 216 – 1 – 1
i32u32-(2n – 1) to 2n – 1 – 1
i64u64-(2n – 1) to 2n – 1 – 1
i128u128-(2n – 1) to 2n – 1 – 1
isizeusizeArch

Signed mencakup bilangan positif dan negatif. Sedangkan unsigned mencakup bilangan positif saja. Jika data hanya memiliki nilai positif gunakan u32 dan untuk data bernilai negatif gunakan i32. Arch adalah singkatan dari architecture, artinya pemrosesan data menyeseuaikan dengan arsitektur komputer (64 bit atau 32 bit).

i8 memiliki range nilai -128 sampai dengan 127 yang berasal dari perhitungan -(28 – 1)= (-128) dan 28 – 1 – 1 = 127.

fn main() {

  let variabel: i8 = 13;
  
  println!("{variabel}");
  
}

Kode di atas akan menghasilkan ouput sebagai berikut:

>>>Compiling variables v0.1.0 (/home/qoory/Rustaceans/variables)
    Finished dev [unoptimized + debuginfo] target(s) in 0.93s
     Running `target/debug/variables`
13

Sukses dijalankan, namun apa yang terjadi jika variabel tersebut dimasukan nilai melebihi range i8?

>>>cargo run
   Compiling variables v0.1.0 (/home/qoory/Rustaceans/variables)
error: literal out of range for `i8`
 --> src/main.rs:2:23
  |
2 |    let variabel: i8 = 129;
  |                       ^^^
  |
  = note: the literal `129` does not fit into the type `i8` whose range is `-128..=127`
  = help: consider using the type `u8` instead
  = note: `#[deny(overflowing_literals)]` on by default

error: could not compile `variables` (bin "variables") due to previous error

Terjadi error dikarenakan angka pada variabel melebihi range i8 dengan nilai maksimal 127 sedangkan pada kode di atas bernilai 129. Untuk mengatasi error tersebut, kita memerlukan i32 atau u32 yang memiliki range nilai lebih besar.

>>>cargo run
   Compiling variables v0.1.0 (/home/qoory/Rustaceans/variables)
    Finished dev [unoptimized + debuginfo] target(s) in 0.20s
     Running `target/debug/variables`
129

Kode berhasil dijalankan dengan lancar setelah mengganti i8 menjadi i32. Opsi lain adalah menggunakan isize dan usize.

Floating-Point

Floating-poin atau bilangan desimal dibagi menjadi dua, yaitu f32 dan f64. Secara default rust menggunakan f64 karena memiliki nilai desimal lebih banyak.

fn main() {

  let a: f32 = 5.87 / 3.2; //variabel dengan f32
  
  println!("f32:{a}"); //output hasil pembagian 

  let b:f64 = 5.87 / 3.2; //variabel dengan f64
  
  println!("f64:{b}"); //output hasil pembagian
}

Kode di atas akan menghasilkan ouput sebagai berikut:

>>>cargo run
   Compiling variables v0.1.0 (/home/qoory/Rustaceans/variables)
    Finished dev [unoptimized + debuginfo] target(s) in 0.20s
     Running `target/debug/variables`
f32:1.8343749
f64:1.8343749999999999

Output tersebut menunjukan bahwa f64 dapat menampung angka lebih banyak dari f32. Kendati demikian, f64 membutuhkan memori lebih besar untuk melakukan pemrosesan data.

Boolean

Boolean memiliki dua nilai pasti, yaitu true dan false. Syntax yang digunakan adalah bool. Digunakan pada kondisi tertentu terutama jika terdapat if statement.

fn main () {

  let umur_saya_21: bool = true;
  let umur_saya_30: bool =  false;
}

Berdasasrkan kode di atas, saya berumur?

Character

Character pada rust adalah tipe scalar untuk unicode yang memiliki cakupan lebih luas dari ASCII. Bahkan dapat memuat bahasa non-alphabet seperti hangul, kanji, dan emoji.

char exists in Rust as a technical compromise. Full proper Unicode support requires a lot of code and extra data tables, which would make the standard library much bigger, and it is too much for some of the platforms that Rust targets.”

– Kornel, Forum Rust(2023)
fn main () {

   let hangul: char = '것';

   let emoji: char = '😀';
   
   println!("{hangul} + {emoji}");
 
 }

Kode di atas akan menghasilkan ouput sebagai berikut:

>>>cargo run
   Compiling variables v0.1.0 (/home/qoory/Rustaceans/variables)
    Finished dev [unoptimized + debuginfo] target(s) in 0.20s
     Running `target/debug/variables`
것 + 😀

Hal yang perlu diperhatikan adalah anotasi yang digunakan tidak sama dengan string, yaitu “text”. char menggunakan ‘text’.

Compound

Compound adalah tipe data yang memiliki lebih dari satu elemen (nilai) dalam variabel. Terbagi menjadi dua, yaitu tuple dan array.

Tuple

Tuple adalah kumpulan jenis data pada satu variabel dengan panjang yang tetap dan size tidak bertambah atau berkurang. Jenis data dapat beragam, misalnya i32, f64, dan u8. Penulisan tuple menggunakan () dan koma ,

fn main () {

let kumpulan_angka: (u8, f64, u32) = (45, 78.89, 2567);

}

Cara Mengambil Elemen Tuple

Cara 1

Jika terdapat 3 nilai pada satu variabel. Kita dapat mengambil salah satu nilai dengan memasangkannya pada variabel baru dengan jumlah yang sama.

fn main () {

  let kumpulan_angka: (u8, f64, u32) = (45, 78.89, 2567);

  let (x, y, z) = kumpulan_angka;

  println!("Nilai dari X adalah {x}");

  println!("Nilai dari z adalah {z}");
}

kumpulan_angka memiliki 3 elemen, yaitu 45, 78.89, 2567 dengan tipe data integer berurutan u8, f64, u32 . Untuk menampilkan salah satu elemen dibuatlah tiga variabel dengan fitur tuple x, y, z agar sesuai dengan jumlah nilai pada kumpulan_angka sehingga menjadi:

  • x = 45
  • y = 78.89
  • z = 2567

Nama variabel juga bersifat bebas, tidak hanya x, y, dan z asalkan jumlahnya sama dengan elemen. Untuk menampilkan satu elemen {variabel} misalnya {x} dan {y}.

Finished dev [unoptimized + debuginfo] target(s) in 0.00s
     Running `target/debug/variables`
Nilai dari X adalah 45
Nilai dari z adalah 2567

Cara 2

Cara ini dilakukan dengan membuat variabel terpisah kemudian mengandalkan proses indexing. Ingat bahwa index pada bahasa pemprogram dimulai dari 0 bukan 1.

fn main () {

   let kumpulan_angka: (u8, f64, u32) = (45, 78.89, 2567);
 
   let angka_pertama = kumpulan_angka.0;

   let angka_ketiga = kumpulan_angka.2;
 
   println!("Index 0 adalah {angka_pertama}");
 
   println!("Index 2 adalah {angka_ketiga}");
 }

Variabel angka_pertama dipasangkan dengan variabel pada kumpulan_angka diikuti dengan .nomor index, yaitu .0 dan .2. Elemen yang akan ditampilkan output sesuai nomor index tersebut.

  • 0 = 45
  • 1 = 78.89
  • 2 = 2567

Terdapat tiga elemen 45, 78.89, 2567. Index tidak dimulai dari angka 1, tetapi 0. Cara ini tentunya menghasilkan banyak variabel.

Array

Array memiliki fungsi yang sama dengan tuple berhubungan dengan penyimpanan elemen lebih dari 1. Array hanya menyimpan nilai dengan jenis yang sama dan panjang yang tetap menggunakan [] dan koma ,.

fn main () {

let variabel_array: [i8; 5] = [10, 20, 30, 40, 50];

}

Angka 5 menunjukan bahwa array memiliki 5 elemen dengan jenis yang sama (i8), yaitu 10, 20, 30, 40, 50. Memaksakan menggunakan tipe data berbeda akan menyebabkan error pada saat proses compiling, maka dari itu gunakanlah tuple.

Lalu bagaimana jika kita ingin menyimpan angka yang sama berjumlah n tanpa harus mengulangi penulisan?

fn main () {

  let array0 = [3; 5];
  
  let hasil = array0[4];
  
  println!("Nilai index 4 adalah {hasil}");
}

Angka 3 adalah nilai dalam variabel sedangkan jumlah ditunjukan dengan angka 5. Secara eksplisit dituliskan [3, 3, 3, 3, 3]. Cara ini Berhubungan dengan efisiensi penulisan kode.

Cara Mengambil Elemen Array

fn main () {

  let variabel_array: [i8; 5] = [10, 20, 30, 40, 50];

  let angka_pertama = variabel_array[0];

  let angka_keempat = variabel_array[3];

  println!("Nilai index 0 adalah {angka_pertama}");
  
  println!("Nilai index 3 adalah {angka_keempat}");

}

Kamu juga bisa melakukannya langsung tanpa menggunakan variabel baru, contohnya $println(“Hasil { } “, variabel_array[0]);

Hampir sama dengan tuple diperlukan pembuatan variabel baru berupa angka_pertama dan angka_keempat. Kemudian dilakukan indexing menggunakan [angka index], yaitu [0] dan [3]. Variabel-variabel tersebut kemudian ditampilkan dalam output menggunakan {nama variabel}.

Kode di atas akan menghasilkan ouput sebagai berikut:

>>> cargo run
   Compiling variables v0.1.0 (/home/qoory/Rustaceans/variables)
    Finished dev [unoptimized + debuginfo] target(s) in 0.19s
     Running `target/debug/variables`
Nilai index 0 adalah 10
Nilai index 3 adalah 40

Array juga dapat menyimpan data berbentuk string. Biasanya digunakan untuk jenis data tetap yang tidak akan berubah seperti nama-nama bulan.

Penutupan

Penulisan tipe data secara eksplisit juga berfungsi agar kode yang telah kita tulis dapat mudah dipahami oleh orang lain. dan keamanan serta kecepatan program akan lebih baik, sebanding dengan komplekstisitas penulisan kode.

Terima kasih telah membaca sampai selesai. Tulisan ini ada karena saya lebih menyukai mencatat hasil belajar untuk review di personal blog dibandingkan menggunakan cara konvensional. Akhir kata, saran dan masukan sangat saya terima.


Discover more from Qorinotes

Subscribe to get the latest posts sent to your email.

Qori Avatar

Published by

Categories:

One response to “Tipe Data Scalar dan Compound Pada Rust”

  1. Destrukturisasi Tuple dan Array – Qorinotes Avatar

    […] udah bahas sebenernya dulu di sini tentang tuple dan array. Ternyata ada hal penting yang kena skip, yaitu tentang destrukturisasi dan […]

    Like