String dan interpolasi

Interpolator s, f, dan raw untuk menyusun string yang terbaca dan terformat.

Daftar isi

String adalah deretan karakter yang menyusun teks, dan pada Scala tipe ini ditulis String dengan sifat immutable, yaitu isinya tidak pernah berubah setelah string diciptakan. Menyambung string dengan operator + dapat dilakukan, tetapi menjadi canggung ketika teks yang disusun memuat banyak nilai. Untuk kebutuhan itu, Scala menyediakan interpolator (interpolator), yaitu huruf yang ditulis di depan string dan mengubah cara string diproses, sehingga ekspresi dapat ditanam langsung ke dalam teks. Topik ini membahas tiga interpolator bawaan, yaitu s untuk penanaman biasa, f untuk format angka, dan raw untuk teks tanpa pemrosesan escape.

Interpolator s#

Huruf s di depan string mengaktifkan interpolasi sederhana. Pengenal ditulis setelah tanda dolar, sedangkan ekspresi yang lebih panjang ditulis di antara kurung kurawal. Hasilnya adalah string baru yang sudah memuat nilai-nilai tersebut.

Simpan program berikut sebagai interpolasi-s.scala.

scala interpolasi-s.scala
// Interpolator s menanamkan nilai ke dalam string
@main def interpolasiS(): Unit =
  val nama = "Dewi"
  val umur = 24

  println(s"$nama berumur $umur tahun")
  println(s"Tahun depan: ${umur + 1}")
  println(s"Panjang nama: ${nama.length}")

Jalankan program tersebut dengan scala-cli.

bash
# mengompilasi dan menjalankan program interpolasi s
scala-cli run interpolasi-s.scala
text Keluaran
Dewi berumur 24 tahun
Tahun depan: 25
Panjang nama: 4

Bentuk $nama dan $umur menanamkan nilai pengenal, sedangkan bentuk ${umur + 1} dan ${nama.length} menanamkan hasil ekspresi di dalam kurung kurawal. Tanda kurung itu wajib untuk ekspresi apa pun yang lebih panjang dari satu pengenal, karena tanpa kurung, tanda titik dan tanda tambah tidak dianggap bagian dari pengenal. Interpolasi dilakukan saat program berjalan, dan hasilnya selalu string baru, karena string yang lama tidak pernah berubah.

Interpolator f#

Huruf f menyediakan interpolasi s sekaligus kemampuan pemformatan menurut aturan printf. Format ditulis langsung setelah ekspresi yang ditanam, dan tanda persen ganda digunakan untuk menyatakan karakter persen yang literal.

Simpan program berikut sebagai interpolasi-f.scala.

scala interpolasi-f.scala
// Interpolator f memformat nilai menurut aturan printf
@main def interpolasiF(): Unit =
  val harga = 12500.0
  val persen = 87.5
  val nomorUrut = 7

  println(f"Tanpa format: $harga%f")
  println(f"Dua desimal : Rp$harga%.2f")
  println(f"Persen      : $persen%.1f%%")
  println(f"Nomor urut  : $nomorUrut%03d")

Jalankan program tersebut.

bash
# mengompilasi dan menjalankan program interpolasi f
scala-cli run interpolasi-f.scala
text Keluaran
Tanpa format: 12500.000000
Dua desimal : Rp12500.00
Persen      : 87.5%
Nomor urut  : 007

Baris pertama menunjukkan perilaku bawaan konversi %f: jumlah desimal selalu enam digit, sehingga 12500.0 tampil sebagai 12500.000000. Jumlah desimal diatur dengan spesifikasi presisi, misalnya %.2f untuk dua digit atau %.1f untuk satu digit. Tanda %% menghasilkan satu karakter persen, dan %03d mengisi nomor dengan nol hingga lebar tiga digit.

Keunggulan utama interpolator f terletak pada pemeriksaannya. Kesesuaian antara tipe nilai dan kode konversi diperiksa compiler, sehingga kesalahan seperti menyisipkan Double ke dalam %d tertangkap saat kompilasi, bukan muncul sebagai runtime exception ketika program berjalan.

Interpolator raw#

Huruf raw menghilangkan pemrosesan escape pada string. Garis miring terbalik ditampilkan apa adanya, sehingga teks yang memuat simbol seperti \n atau \d tidak berubah menjadi karakter khusus.

Simpan program berikut sebagai interpolasi-raw.scala.

scala interpolasi-raw.scala
// Interpolator raw mempertahankan garis miring terbalik
@main def interpolasiRaw(): Unit =
  val pola = "\\d{3}-\\d{4}"

  println(s"dengan s  : $pola")
  println(raw"dengan raw: \d{3}-\d{4}")
  println(s"dengan s  : baris\nbaru")
  println(raw"dengan raw: baris\nbaru")

Jalankan program tersebut.

bash
# mengompilasi dan menjalankan program interpolasi raw
scala-cli run interpolasi-raw.scala
text Keluaran
dengan s  : \d{3}-\d{4}
dengan raw: \d{3}-\d{4}
dengan s  : baris
baru
dengan raw: baris\nbaru

Dua baris pertama memperlihatkan persamaan antara s dan raw. String "\\d{3}-\\d{4}" yang ditulis dengan escape ganda menghasilkan teks yang sama dengan string raw"\d{3}-\d{4}", yaitu \d{3}-\d{4}. Dua baris berikutnya memperlihatkan perbedaannya: s"...\n..." memproses \n menjadi pergantian baris sungguhan, sedangkan raw"..." mempertahankan dua karakter \n pada teks.

Interpolasi raw paling berguna untuk ekspresi reguler, jalur berkas bergaya Windows, dan teks lain yang kaya garis miring terbalik, karena teksnya ditulis persis seperti yang akan dibaca.

Memilih interpolator#

Ketiga interpolator dirangkum pada tabel berikut, dengan umur yang bernilai 24 sebagai variabel contoh.

InterpolatorPeranContohHasil
smenanamkan pengenal dan ekspresis"umur: $umur"umur: 24
finterpolasi dengan format printff"umur: $umur%03d"umur: 024
rawtanpa pemrosesan escaperaw"baris\nbaru"baris\nbaru

Pemilihannya mengikuti kebutuhan. Gunakan s untuk penyusunan teks pada umumnya, karena singkat dan sudah cukup untuk sebagian besar kasus. Gunakan f ketika tampilan angka perlu diatur, misalnya harga dengan dua desimal atau nomor dengan lebar tetap. Gunakan raw ketika teksnya memuat garis miring terbalik yang harus tampil apa adanya. Ketiganya menghasilkan String biasa, sehingga hasilnya dapat disimpan, disambung, dan diproses seperti string lain.

Kesalahan umum#

Beberapa kesalahan berikut muncul ketika interpolasi baru mulai digunakan.

  • Lupa menulis huruf interpolator. String "$nama" tanpa awalan s dicetak apa adanya, sehingga keluarannya berisi tanda dolar dan nama variabelnya. Perbaikannya sederhana, yaitu menambahkan s di depan tanda kutip.
  • Menulis tanda persen literal pada interpolator f tanpa menggandakannya. String f"tercapai 100%" ditolak compiler karena % tunggal dianggap sebagai awal kode konversi. Tulis f"tercapai 100%%" untuk tanda persen yang literal.
  • Menyisipkan tipe yang tidak cocok dengan kode konversi, misalnya nilai Double ke %d. Pemeriksaan compiler menolaknya sebelum program berjalan, dan perbaikannya adalah memilih kode konversi yang tepat atau mengonversi nilainya terlebih dahulu.
  • Menganggap interpolasi mengubah string yang lama. Hasil interpolasi selalu string baru, sehingga penulisan nama.toUpperCase tanpa menampung hasilnya tidak mengubah nama.

Ringkasan#

  • Interpolator s menanamkan pengenal dengan $nama dan ekspresi dengan ${ekspresi} ke dalam string.
  • Interpolator f menambahkan format printf, dengan %f menghasilkan enam desimal secara bawaan kecuali diatur seperti %.2f, dan tanda persen literal ditulis %%.
  • Interpolator raw mempertahankan garis miring terbalik, sehingga cocok untuk ekspresi reguler dan jalur berkas.
  • Kesesuaian tipe pada format f diperiksa compiler, dan setiap interpolasi menghasilkan string baru karena String bersifat immutable.

Referensi#