Lewati ke konten

String di Rust

Mengolah teks adalah salah satu hal pertama yang terasa berbeda di Rust dibanding bahasa lain, terutama karena Rust sebenarnya punya dua tipe string. Begitu kamu paham alasannya, semuanya tidak lagi membingungkan.

  • &str (“string slice”, potongan string): teks yang sudah ada di suatu tempat, biasanya ditulis langsung di kode. Ukurannya tetap dan tidak bisa bertambah.
  • String: teks yang dimiliki sendiri (owned) dan bisa bertambah panjang. Kamu bisa menambahkan isinya, dan datanya disimpan di heap.
fn main() {
let literal: &str = "halo"; // sebuah string slice
let owned: String = String::from("halo"); // sebuah String yang owned
println!("{literal} / {owned}");
}
▶ Coba sendiri

Patokan sederhananya: kalau kamu hanya menampilkan teks yang tetap, "seperti ini" (sebuah &str) sudah cukup. Kalau kamu perlu menyusun, menambah, atau mengubah teks saat program berjalan, pakailah String.

fn main() {
let mut greeting = String::from("Halo");
greeting.push_str(", Dunia"); // tambahkan sebuah &str
greeting.push('!'); // tambahkan satu char
println!("{greeting}");
}

Output:

Halo, Dunia!
▶ Coba sendiri

Kamu bisa menggabungkan string dengan +, atau memakai format! (yang biasanya lebih jelas):

fn main() {
let first = String::from("Halo, ");
let second = String::from("Dunia!");
let combined = first + &second; // perhatikan & sebelum second
println!("{combined}");
// format! sering kali lebih mudah dibaca:
let name = "Ferris";
let greeting = format!("Halo, {name}!");
println!("{greeting}");
}
▶ Coba sendiri

Beberapa method yang akan sering sekali kamu pakai:

fn main() {
let text = " Hello, Rust! ";
println!("{}", text.trim()); // "Hello, Rust!" (tanpa spasi di pinggir)
println!("{}", text.to_uppercase()); // " HELLO, RUST! "
println!("{}", text.to_lowercase()); // " hello, rust! "
println!("{}", text.contains("Rust")); // true
println!("{}", text.trim().len()); // 12 (panjang dalam byte)
println!("{}", text.trim().replace("Rust", "World")); // "Hello, World!"
}
▶ Coba sendiri

Teks di contoh ini sengaja dibiarkan dalam bahasa Inggris, karena salah satu barisnya menampilkan panjang string (12). Kalau teksnya diganti, angkanya juga ikut berubah.

Untuk membaca string karakter demi karakter, pakai .chars():

fn main() {
for c in "abc".chars() {
println!("{c}");
}
}
▶ Coba sendiri

Seseorang mengetik " rUsT is FUN " di sebuah form. Ubah menjadi rust is great: hapus spasi berlebih, jadikan huruf kecil semua, lalu ganti fun dengan great. Setelah itu, tampilkan hasilnya beserta panjangnya. Petunjuk: method string bisa dirangkai satu setelah yang lain: text.trim().to_lowercase()....

Lihat solusi
fn main() {
let input = " rUsT is FUN ";
// trim dulu, lalu jadikan huruf kecil, lalu ganti "fun" (sekarang sudah huruf kecil)
let clean = input.trim().to_lowercase().replace("fun", "great");
println!("{clean}");
println!("{} byte", clean.len());
}

Output:

rust is great
13 byte
▶ Coba sendiri

Urutannya penting: kalau kamu memanggil .replace("fun", "great") sebelum .to_lowercase(), tidak ada yang diganti, karena teksnya masih bertuliskan FUN. (Teks di latihan ini tetap dalam bahasa Inggris karena panjangnya ikut ditampilkan.)

Diberikan first = "Ada" dan last = "Lovelace", susun String [email protected] lalu tampilkan. Setelah itu, tampilkan apakah string itu mengandung @. Petunjuk: format! bisa menerima ekspresi seperti first.to_lowercase() sebagai argumen untuk slot {}-nya.

Lihat solusi
fn main() {
let first = "Ada";
let last = "Lovelace";
let email = format!("{}.{}@example.com", first.to_lowercase(), last.to_lowercase());
println!("{email}");
println!("terlihat valid: {}", email.contains('@'));
}

Output:

terlihat valid: true
▶ Coba sendiri
  • &str adalah teks pinjaman (borrowed) yang ukurannya tetap; String dimiliki sendiri (owned) dan bisa bertambah.
  • Tambahkan isi String dengan .push_str() (untuk teks) atau .push() (untuk satu karakter).
  • Utamakan format! daripada + saat menggabungkan string. Lebih jelas dan tidak memindahkan apa pun.
  • Method yang sering dipakai: .trim(), .to_uppercase(), .contains(), .replace(), .chars().

Kuis singkat

1. Tipe string mana yang owned (dimiliki sendiri) dan bisa bertambah saat program berjalan?

2. Kenapa halaman ini lebih memilih format! daripada + saat menggabungkan lebih dari satu atau dua string?

3. Kenapa kamu tidak bisa mengakses string Rust dengan indeks seperti text[0]?

4. Method mana yang menambahkan satu karakter ke sebuah String, seperti greeting.push('!')?

Skor: 0 / 4