String

Interpolasi #{}, metode string yang umum digunakan, serta sifat mutabilitas dan frozen string literal.

Daftar isi

String adalah tipe data untuk teks dan menjadi salah satu tipe yang paling sering disentuh dalam program apa pun. Topik ini membahas penulisan literal string, interpolasi, metode pengolahan yang paling umum, sifat mutabilitas string, serta pengaturan frozen string literal. Contohnya menggunakan ranah pengolah teks sederhana agar setiap metode mudah diuji ulang.

Literal string: petik tunggal dan petik ganda#

Literal string ditulis di antara tanda petik tunggal maupun petik ganda, dan keduanya menghasilkan objek String. Perbedaannya terletak pada pemrosesan yang dikerjakan Ruby. Petik ganda memroses escape sequence, yaitu kombinasi karakter khusus seperti \n untuk baris baru, serta interpolasi. Petik tunggal nyaris tidak memroses apa pun, kecuali \' serta \\ yang tetap dikenalnya sebagai karakter khusus.

ruby Contoh: petik tunggal tidak memroses interpolasi
puts "interpolasi berjalan: #{1 + 2}"
puts 'interpolasi berjalan: #{1 + 2}'
text Keluaran
interpolasi berjalan: 3
interpolasi berjalan: #{1 + 2}

Karena tidak melakukan pemrosesan, petik tunggal cocok untuk teks yang memang tidak membutuhkan perlakuan khusus, misalnya label tetap. Petik ganda menjadi pilihan utama begitu teks memuat baris baru, tabulasi, atau hasil ekspresi. Escape sequence yang paling sering digunakan adalah \n, yang memindahkan tampilan ke baris berikutnya.

ruby Contoh: escape sequence pada petik ganda
puts "baris pertama\nbaris kedua"
text Keluaran
baris pertama
baris kedua

Interpolasi#

Interpolasi menyisipkan hasil ekspresi Ruby ke dalam string berpetik ganda melalui tanda #{}. Isi kurung kurawal itu dievaluasi sebagai ekspresi biasa, lalu hasilnya diubah ke string dan ditempelkan pada posisinya. Ekspresi yang disisipkan boleh berupa variabel, operasi aritmetika, maupun pemanggilan metode.

ruby Contoh: interpolasi variabel dan ekspresi
nama = "rubin"
puts "tolong, #{nama}!"
puts "hasil: #{1 + 2}"
text Keluaran
tolong, rubin!
hasil: 3

Pada string berpetik tunggal, tanda #{} tidak diproses dan muncul apa adanya, sebagaimana terlihat pada bagian sebelumnya. Pola interpolasi paling berguna pada pesan yang menyertakan nilai variabel, seperti laporan hasil perhitungan. Alternatif lain memang tersedia, yaitu menggabungkan string dengan operator +, tetapi penggabungan itu menuntut setiap bagian sudah berbentuk string, sedangkan interpolasi melakukan konversi tersebut secara otomatis.

Metode string yang umum#

Kelas String menyediakan metode pengolahan teks yang mencakup perapian, perubahan huruf, pemeriksaan isi, dan pemecahan. Berkas berikut memuat metode yang paling sering digunakan dalam pekerjaan sehari-hari.

ruby metode-string.rb
# metode-string.rb
# Metode string yang paling sering digunakan.

kalimat = "  Ruby menyenangkan  "

puts kalimat.strip          # buang spasi di kedua ujung
puts kalimat.strip.length   # panjang teks setelah spasi dibuang
puts "ruby".upcase
puts "RUBY".downcase
puts "rubin".reverse
puts "rubin".include?("bin")
puts "a-b-c".split("-")
puts "a-b-c".gsub("-", "+")
text Keluaran
Ruby menyenangkan
17
RUBY
ruby
nibur
true
a
b
c
a+b+c

Metode strip membuang spasi pada kedua ujung string, sedangkan length menghitung jumlah karakternya. Metode upcase dan downcase mengubah huruf, reverse membalik urutan karakter, dan include? memeriksa keberadaan potongan teks dengan jawaban true atau false. Metode split memecah string menjadi deretan string berdasarkan pemisahnya, sedangkan gsub mengganti semua kemunculan pola. Metode sub yang serupa hanya mengganti kemunculan pertama.

Metode string dapat dirangkai karena setiap metode mengembalikan objek string baru. Pemanggilan " Ruby ".strip.upcase membersihkan spasi terlebih dahulu, kemudian mengubah hasilnya menjadi huruf besar.

ruby Contoh: merangkai beberapa metode string
puts "  Ruby  ".strip.upcase
puts "Ruby menyenangkan".include?("menyenangkan")
text Keluaran
RUBY
true

Demo berikut mensimulasikan empat metode di atas pada teks yang dapat disunting. Tekan salah satu tombol, lalu bandingkan hasilnya dengan baris kode Ruby yang setara.

Kode sumber demo
<!DOCTYPE html>
<html lang="id">
<head>
<meta charset="utf-8">
<title>Pengolah teks mini</title>
<style>
  body { font-family: Helvetica, Arial, sans-serif; margin: 0; padding: 12px; font-size: 14px; color: #1a1a1a; }
  label { display: block; margin-bottom: 4px; color: #555555; }
  textarea { width: 100%; height: 58px; box-sizing: border-box; padding: 8px; font-size: 14px; border: 1px solid #bbbbbb; border-radius: 4px; }
  .tombol { margin: 8px 4px 0 0; padding: 6px 12px; font-size: 13px; font-family: monospace; cursor: pointer; }
  #hasil { margin-top: 10px; padding: 8px; background: #f4f4f4; border-radius: 4px; min-height: 34px; white-space: pre-wrap; }
  #kode { margin-top: 6px; color: #666666; font-family: monospace; font-size: 13px; }
</style>
</head>
<body>
  <label for="teks">Teks awal (dapat diubah):</label>
  <textarea id="teks">Ruby menyenangkan</textarea>
  <div>
    <button class="tombol" data-opsi="upcase">upcase</button>
    <button class="tombol" data-opsi="downcase">downcase</button>
    <button class="tombol" data-opsi="reverse">reverse</button>
    <button class="tombol" data-opsi="length">length</button>
  </div>
  <div id="hasil">tekan salah satu tombol di atas</div>
  <div id="kode"></div>
  <script>
    var teks = document.getElementById('teks');
    var hasil = document.getElementById('hasil');
    var kode = document.getElementById('kode');
    var pasangan = {
      upcase: function (t) { return t.toUpperCase(); },
      downcase: function (t) { return t.toLowerCase(); },
      reverse: function (t) { return t.split('').reverse().join(''); },
      length: function (t) { return String(t.length); }
    };
    var tombol = document.querySelectorAll('.tombol');
    for (var i = 0; i < tombol.length; i++) {
      tombol[i].addEventListener('click', function () {
        var opsi = this.getAttribute('data-opsi');
        hasil.textContent = pasangan[opsi](teks.value);
        kode.textContent = 'setara dengan: puts teks.' + opsi;
      });
    }
  </script>
</body>
</html>

String dapat diubah#

Objek String bersifat mutable, yaitu isinya dapat diubah setelah objeknya terbentuk, berbeda dari bilangan yang nilainya tidak pernah berubah. Metode yang mengubah objek di tempat lazim diberi tanda seru di akhir namanya, misalnya upcase!, dan metode seperti ini dijuluki bang method. Metode tanpa tanda seru mengembalikan string baru tanpa menyentuh objek lamanya.

ruby Contoh: metode tanpa tanda seru mengembalikan string baru
salam = "halo"
puts salam.upcase
puts salam
text Keluaran
HALO
halo

Metode dengan tanda seru bekerja pada objek yang sama. Metode << menambahkan teks pada ujung string yang sudah ada, sedangkan upcase! mengubah hurufnya di tempat.

ruby Contoh: mutasi string di tempat
teks = "rubin"
teks << " bit"
puts teks
salam = "halo"
salam.upcase!
puts salam
text Keluaran
rubin bit
HALO

Sifat mutabilitas ini praktis, tetapi menjadi sumber kejutan apabila string yang dirujuk banyak nama berubah tanpa sengaja, sebagaimana perilaku rujukan yang dibahas pada topik Variabel. Perubahan di tempat memang tidak menyalin isi string, tetapi akibatnya berlaku pada setiap nama yang menunjuk objek yang sama. Ruby menyediakan mekanisme untuk kebutuhan sebaliknya, yaitu membekukan string agar tidak dapat diubah sama sekali. Pengaturan tersebut dibahas pada bagian berikut.

Frozen string literal#

Komentar khusus # frozen_string_literal: true yang diletakkan pada baris pertama berkas membuat seluruh literal string dalam berkas itu menjadi beku (frozen), yakni tidak dapat diubah. String yang beku menolak setiap mutasi, dan usaha mengubahnya memunculkan error. Pengaturan ini juga menghemat penggunaan memori karena string yang identik tidak dibuat berulang kali sebagai objek duplikat.

Perbandingan berikut memperlihatkan perbedaannya. Berkas frozen.rb memuat komentar khusus tersebut, sedangkan mutabel.rb tidak memuatnya.

ruby frozen.rb
# frozen_string_literal: true

teks = "rubin"
puts teks.frozen?
puts "rubin".equal?("rubin")
text Keluaran
true
true
ruby mutabel.rb
# mutabel.rb
teks = "rubin"
puts teks.frozen?
text Keluaran
false

Keluaran dari frozen.rb memperlihatkan dua hal. Metode frozen? menjawab true, artinya literal string pada berkas itu memang beku. Perbandingan equal? antara dua penulisan literal yang sama juga menghasilkan true, yang berarti keduanya menunjuk satu objek yang didaftarkan hanya sekali. Pada mutabel.rb, metode frozen? menjawab false karena setiap penulisan literal dibuat sebagai objek baru yang bebas dimutasi.

ruby Contoh: mutasi pada string beku memunculkan error
# tidak-dijalankan
# Dengan frozen_string_literal: true, baris terakhir memunculkan FrozenError.
teks = "rubin"
teks << " bit"

Ringkasan#

  • Petik ganda memroses escape sequence dan interpolasi, sedangkan petik tunggal menampilkan isi hampir apa adanya.
  • Interpolasi #{} menyisipkan hasil ekspresi Ruby ke dalam string berpetik ganda dengan konversi otomatis.
  • Metode seperti strip, upcase, include?, split, dan gsub menutupi kebutuhan pengolahan teks sehari-hari.
  • String bersifat mutable, dan komentar # frozen_string_literal: true membekukan seluruh literal string pada berkasnya.

Referensi#