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.
// 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.
# mengompilasi dan menjalankan program interpolasi s
scala-cli run interpolasi-s.scalaDewi berumur 24 tahun
Tahun depan: 25
Panjang nama: 4Bentuk $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.
// 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.
# mengompilasi dan menjalankan program interpolasi f
scala-cli run interpolasi-f.scalaTanpa format: 12500.000000
Dua desimal : Rp12500.00
Persen : 87.5%
Nomor urut : 007Baris 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.
// 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.
# mengompilasi dan menjalankan program interpolasi raw
scala-cli run interpolasi-raw.scaladengan s : \d{3}-\d{4}
dengan raw: \d{3}-\d{4}
dengan s : baris
baru
dengan raw: baris\nbaruDua 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.
| Interpolator | Peran | Contoh | Hasil |
|---|---|---|---|
s | menanamkan pengenal dan ekspresi | s"umur: $umur" | umur: 24 |
f | interpolasi dengan format printf | f"umur: $umur%03d" | umur: 024 |
raw | tanpa pemrosesan escape | raw"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 awalansdicetak apa adanya, sehingga keluarannya berisi tanda dolar dan nama variabelnya. Perbaikannya sederhana, yaitu menambahkansdi depan tanda kutip. - Menulis tanda persen literal pada interpolator
ftanpa menggandakannya. Stringf"tercapai 100%"ditolak compiler karena%tunggal dianggap sebagai awal kode konversi. Tulisf"tercapai 100%%"untuk tanda persen yang literal. - Menyisipkan tipe yang tidak cocok dengan kode konversi, misalnya nilai
Doubleke%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.toUpperCasetanpa menampung hasilnya tidak mengubahnama.
Ringkasan#
- Interpolator
smenanamkan pengenal dengan$namadan ekspresi dengan${ekspresi}ke dalam string. - Interpolator
fmenambahkan format printf, dengan%fmenghasilkan enam desimal secara bawaan kecuali diatur seperti%.2f, dan tanda persen literal ditulis%%. - Interpolator
rawmempertahankan garis miring terbalik, sehingga cocok untuk ekspresi reguler dan jalur berkas. - Kesesuaian tipe pada format
fdiperiksa compiler, dan setiap interpolasi menghasilkan string baru karenaStringbersifat immutable.
Referensi#
- String Interpolation — Scala Center — Merinci interpolator s, f, dan raw beserta aturan formatnya.
- Scala 3 Book: String Interpolation — Scala Center — Pengenalan interpolasi string pada Scala 3.
- Kelas Formatter — Oracle — Spesifikasi konversi format seperti %d dan %f yang mendasari interpolator f.