Tipe Data #
Tipe data dalam Rust adalah fundamental untuk bagaimana bahasa ini menangani penyimpanan, manipulasi, dan penggunaan data. Rust adalah bahasa pemrograman yang kuat secara statis, yang berarti bahwa tipe data dari semua variabel harus diketahui pada saat kompilasi. Ini memberikan keunggulan dalam hal kinerja dan keamanan tipe.
Rust mendukung berbagai tipe data, yang dapat dikategorikan menjadi tipe primitif (scalar types), tipe komposit (compound types), tipe referensi, tipe koleksi, tipe khusus, dan lainnya. Di bawah ini adalah penjelasan lengkap tentang tipe-tipe data ini.
Tipe Primitif (Scalar Types) #
Tipe primitif adalah tipe data dasar yang tidak dapat dipecah menjadi tipe yang lebih sederhana. Rust memiliki empat kategori tipe primitif:
Bilangan Bulat (Integer Types) #
Tipe bilangan bulat menyimpan nilai numerik yang tidak memiliki bagian desimal. Rust mendukung berbagai tipe bilangan bulat, termasuk signed dan unsigned dengan berbagai ukuran bit.
-
Signed Integers (
i
): Menyimpan bilangan bulat yang dapat bernilai negatif atau positif.i8
: 8-bit, kisaran -128 hingga 127i16
: 16-bit, kisaran -32,768 hingga 32,767i32
: 32-bit, kisaran -2,147,483,648 hingga 2,147,483,647i64
: 64-bit, kisaran -9,223,372,036,854,775,808 hingga 9,223,372,036,854,775,807i128
: 128-bit, kisaran yang sangat besarisize
: Ukuran tergantung pada arsitektur, 32-bit pada sistem 32-bit dan 64-bit pada sistem 64-bit.
-
Unsigned Integers (
u
): Menyimpan bilangan bulat non-negatif.u8
: 8-bit, kisaran 0 hingga 255u16
: 16-bit, kisaran 0 hingga 65,535u32
: 32-bit, kisaran 0 hingga 4,294,967,295u64
: 64-bit, kisaran 0 hingga 18,446,744,073,709,551,615u128
: 128-bit, kisaran yang sangat besarusize
: Ukuran tergantung pada arsitektur, 32-bit pada sistem 32-bit dan 64-bit pada sistem 64-bit.
Contoh:
fn main() {
let x: i32 = 42;
let y: u64 = 123456789;
println!("x: {}, y: {}", x, y);
}
Bilangan Pecahan (Floating-Point Types) #
Tipe bilangan pecahan menyimpan nilai numerik yang memiliki bagian desimal. Rust mendukung dua tipe floating-point yang mematuhi standar IEEE 754.
f32
: 32-bit floating-pointf64
: 64-bit floating-point (ini adalah tipe default untuk bilangan pecahan di Rust)
Contoh:
fn main() {
let x: f64 = 3.14;
let y: f32 = 2.718;
println!("x: {}, y: {}", x, y);
}
Nilai Boolean (Boolean Type) #
Tipe boolean hanya memiliki dua nilai yang mungkin: true
atau false
. Tipe ini digunakan untuk ekspresi logika dan kontrol alur program.
bool
: Tipe boolean
Contoh:
fn main() {
let is_rust_great: bool = true;
println!("Is Rust great? {}", is_rust_great);
}
Tipe Karakter (Character Type) #
Rust menggunakan tipe karakter char
untuk merepresentasikan satu karakter Unicode. Tipe ini mencakup semua karakter dari berbagai bahasa, simbol, dan emoji.
char
: Karakter tunggal dalam Unicode, berukuran 4 byte.
Contoh:
fn main() {
let letter: char = 'R';
let emoji: char = '😊';
println!("Letter: {}, Emoji: {}", letter, emoji);
}
Tipe Komposit (Compound Types) #
Tipe komposit adalah tipe data yang dapat menggabungkan beberapa nilai dari berbagai tipe menjadi satu kesatuan.
Tuple #
Tuple adalah tipe komposit yang dapat menyimpan sejumlah elemen dengan tipe yang berbeda. Tuple berguna untuk mengelompokkan beberapa nilai yang berbeda menjadi satu unit.
Contoh:
fn main() {
let tup: (i32, f64, char) = (42, 3.14, 'R');
let (x, y, z) = tup; // Destructuring
println!("x: {}, y: {}, z: {}", x, y, z);
}
Akses Elemen:
fn main() {
let tup: (i32, f64, char) = (42, 3.14, 'R');
println!("First: {}, Second: {}, Third: {}", tup.0, tup.1, tup.2);
}
Array #
Array adalah kumpulan elemen dengan tipe yang sama yang disimpan secara berurutan di memori. Ukuran array tetap dan tidak bisa diubah setelah didefinisikan.
Contoh:
fn main() {
let arr: [i32; 3] = [1, 2, 3];
println!("First element: {}", arr[0]);
}
Inisialisasi Array dengan Nilai Default:
fn main() {
let arr = [0; 5]; // Array dengan 5 elemen, semua bernilai 0
println!("Array: {:?}", arr);
}
Tipe Referensi #
Tipe referensi memungkinkan kita untuk mengacu pada data tanpa memilikinya secara langsung. Referensi digunakan dalam konteks pengelolaan memori yang aman di Rust, terutama terkait dengan konsep ownership dan borrowing.
Referensi dan Borrowing #
Referensi memungkinkan Anda untuk meminjam data dari suatu variabel tanpa mengambil alih kepemilikannya.
- Referensi Immutable (
&
): Mengizinkan membaca data tanpa mengubahnya. - Referensi Mutable (
&mut
): Mengizinkan membaca dan mengubah data.
Contoh Referensi Immutable:
fn main() {
let s = String::from("Hello");
let r1 = &s;
let r2 = &s;
println!("{} and {}", r1, r2);
}
Contoh Referensi Mutable:
fn main() {
let mut s = String::from("Hello");
let r1 = &mut s;
r1.push_str(", world!");
println!("{}", r1);
}
Tipe Koleksi #
Rust menyediakan beberapa tipe koleksi untuk mengelola kumpulan elemen dengan cara yang lebih dinamis dan fleksibel daripada array.
Vektor (Vectors) #
Vec<T>
adalah tipe koleksi yang dapat menampung sejumlah elemen dengan tipe yang sama, tetapi tidak seperti array, ukurannya dapat bertambah atau berkurang secara dinamis.
Contoh:
fn main() {
let mut v: Vec<i32> = Vec::new();
v.push(1);
v.push(2);
v.push(3);
println!("Vektor: {:?}", v);
}
String #
Rust memiliki tipe String
yang digunakan untuk menyimpan data teks yang dinamis (dapat diubah ukurannya). String
adalah tipe data yang sering digunakan dalam pengolahan teks karena lebih fleksibel daripada tipe &str
.
Contoh:
fn main() {
let mut s = String::from("Hello");
s.push_str(", world!");
println!("{}", s);
}
Tipe Khusus #
Rust juga memiliki beberapa tipe khusus yang berguna untuk penanganan kasus tertentu.
Option<T>
#
Option<T>
adalah enum yang digunakan untuk menyatakan nilai yang mungkin ada atau mungkin tidak ada. Option
mencegah nilai null
dan memaksa pengembang untuk menangani kasus di mana nilai mungkin tidak ada.
Contoh:
fn main() {
let some_number: Option<i32> = Some(42);
let absent_number: Option<i32> = None;
match some_number {
Some(n) => println!("Ada angka: {}", n),
None => println!("Tidak ada angka"),
}
}
Result<T, E>
#
Result<T, E>
adalah enum yang digunakan untuk penanganan kesalahan. Result
memiliki dua varian: Ok(T)
untuk hasil sukses dan Err(E)
untuk hasil gagal.
Contoh:
fn main() {
let result: Result<i32, &str> = Ok(42);
match result {
Ok(n) => println!("S
ukses dengan nilai: {}", n),
Err(e) => println!("Gagal dengan pesan: {}", e),
}
}
Tipe Generik #
Rust mendukung tipe generik, yang memungkinkan tipe data dan fungsi dapat bekerja dengan berbagai tipe lain tanpa harus menentukan tipe secara spesifik. Generik sangat berguna dalam penulisan kode yang dapat digunakan kembali.
Contoh Fungsi Generik:
fn largest<T: PartialOrd>(list: &[T]) -> &T {
let mut largest = &list[0];
for item in list.iter() {
if item > largest {
largest = item;
}
}
largest
}
fn main() {
let number_list = vec![34, 50, 25, 100, 65];
let result = largest(&number_list);
println!("Nilai terbesar adalah {}", result);
}
Tipe Data Kustom #
Rust memungkinkan Anda untuk mendefinisikan tipe data kustom dengan menggunakan struct
untuk merepresentasikan struktur data dan enum
untuk merepresentasikan nilai yang mungkin dari tipe tertentu.
Struktur (Struct) #
struct
digunakan untuk membuat tipe data kustom dengan field yang memiliki tipe yang berbeda.
Contoh:
struct Point {
x: f64,
y: f64,
}
fn main() {
let p = Point { x: 3.0, y: 4.0 };
println!("Point: ({}, {})", p.x, p.y);
}
Enums #
enum
digunakan untuk mendefinisikan tipe data yang dapat berupa salah satu dari beberapa varian yang berbeda.
Contoh:
enum Direction {
Up,
Down,
Left,
Right,
}
fn main() {
let dir = Direction::Up;
match dir {
Direction::Up => println!("Moving up"),
Direction::Down => println!("Moving down"),
Direction::Left => println!("Moving left"),
Direction::Right => println!("Moving right"),
}
}
Kesimpulan #
Rust memiliki sistem tipe data yang kuat dan kaya, yang memastikan keamanan memori dan integritas data pada waktu kompilasi. Dengan berbagai tipe primitif, komposit, referensi, koleksi, khusus, dan generik, Rust menyediakan alat yang fleksibel untuk menangani berbagai kebutuhan pemrograman. Memahami dan memanfaatkan tipe data di Rust adalah kunci untuk menulis kode yang aman, efisien, dan dapat dipelihara.