String pada Kotlin tidak hanya menyimpan teks statis, karena tanda dolar memungkinkan nilai variabel disisipkan langsung ke dalam teks tersebut. Fitur ini disebut string template, yaitu mekanisme penyusunan teks yang isinya dihitung saat program berjalan. Topik ini membahas template satu variabel, ekspresi arbitrer dalam kurung kurawal, serta raw string dengan tiga tanda kutip.
Menyisipkan nilai dengan string template#
Template paling sederhana menempatkan tanda dolar di depan nama variabel. Buat berkas template.kt berikut.
fun main() {
val nama = "Budi"
val nilai = 92
println("Siswa: $nama")
println("Nilai: $nilai")
println("Tanda \$ tidak memulai template")
}# kompilasi template.kt dengan pustaka standar tersemat
kotlinc template.kt -include-runtime -d template.jar
# jalankan program
java -jar template.jarSiswa: Budi
Nilai: 92
Tanda $ tidak memulai templateTanda $nama diganti isi variabelnya, begitu pula $nilai, tanpa perlu operasi penggabungan yang ditulis manual. Tanda dolar yang harus tampil sebagai karakter biasa ditulis dengan escape \$, seperti pada baris ketiga. Di depan karakter yang tidak bisa membentuk nama variabel, misalnya spasi atau digit, tanda dolar diperlakukan sebagai teks biasa sehingga "$99" dicetak apa adanya.
Template hanya membaca nilai yang ada dan tidak dapat mengubahnnya, sehingga $nilai di dalam teks memiliki makna yang sama dengan menyebut variabelnya di mana pun. Akibatnya, hasil teks selalu ikut nilai terbaru pada saat baris itu dijalankan, dan tidak ada salinan tersembunyi yang perlu dilacak.
Pada tingkat bytecode, template diterjemahkan compiler menjadi operasi penggabungan yang efisien, sehingga fitur ini bersifat notasi semata dan tidak menambah pekerjaan pada saat program berjalan. Keterbacaan yang diperoleh jauh lebih besar daripada penulisan "Siswa: " + nama berulang kali.
Ekspresi arbitrer dalam kurung kurawal#
Tanda dolar hanya menerima satu nama variabel setelahnya. Untuk hasil pemanggilan fungsi, perhitungan, atau pengambilan karakter, ekspresinya dibungkus kurung kurawal dalam bentuk ${...}. Buat berkas ekspresi.kt berikut.
fun main() {
val nama = "budi"
val harga = 24
val jumlah = 10
println("Siswa: ${nama.uppercase()}")
println("Total: ${harga * jumlah}")
println("Karakter pertama: ${nama[0]}")
}# kompilasi ekspresi.kt dengan pustaka standar tersemat
kotlinc ekspresi.kt -include-runtime -d ekspresi.jar
# jalankan program
java -jar ekspresi.jarSiswa: BUDI
Total: 240
Karakter pertama: bEkspresi di dalam kurung kurawal dievaluasi terlebih dahulu, kemudian hasilnya diubah menjadi teks dan disisipkan pada posisinya. Pemanggilan nama.uppercase() menghasilkan BUDI, perkalian harga * jumlah menghasilkan 240, dan pengambilan indeks nama[0] menghasilkan karakter b. Bentuk ${...} menerima ekspresi apa pun yang sah dalam bahasa Kotlin, dan hasilnya selalu dikonversi menjadi string secara otomatis.
Karena isinya harus berupa satu ekspresi, perhitungan yang menempel banyak langkah sebaiknya dihitung lebih dahulu ke dalam sebuah val, lalu hasil akhirnya yang disisipkan. Praktik ini menjaga baris println tetap pendek dan mudah dibaca, sementara ekspresi panjang yang disisipkan langsung cenderung menyembunyikan maksudnya.
Raw string dengan tiga tanda kutip#
Raw string ditulis dengan tiga tanda kutip ganda dan mempertahankan seluruh karakter di dalamnya, termasuk baris baru, spasi, dan tanda kutip tunggal maupun ganda. Bentuk ini cocok untuk teks berbaris-baris seperti laporan atau potongan dokumen. Buat berkas raw.kt berikut.
fun main() {
val laporan = """
Laporan Nilai
Nama : Citra
Nilai : 92
""".trimIndent()
println(laporan)
println("""Kutipan: "Belajar Kotlin" tanpa escape""")
}# kompilasi raw.kt dengan pustaka standar tersemat
kotlinc raw.kt -include-runtime -d raw.jar
# jalankan program
java -jar raw.jarLaporan Nilai
Nama : Citra
Nilai : 92
Kutipan: "Belajar Kotlin" tanpa escapeRaw string pada variabel laporan menampung tiga baris teks sekaligus tanpa satu pun \n, dan tanda kutip ganda pada baris terakhir tidak perlu di-escape. Fungsi trimIndent() menghapus spasi awal baris yang sama pada semua baris, sehingga indentasi kode sumber tidak ikut tercetak. Dua sifat tersebut menjadikan raw string bentuk yang paling nyaman untuk teks berbaris-baris, dan kombinasi penuhnya dengan template dibahas pada bagian Template di dalam raw string.
Template di dalam raw string#
Template tetap bekerja di dalam raw string, sehingga teks berbaris-baris yang isinya berubah dapat disusun tanpa operasi penggabungan. Buat berkas rawtemplate.kt berikut.
fun main() {
val nilai = 92
val laporan = """
Rata-rata kelas: $nilai
""".trimIndent()
println(laporan)
}# kompilasi rawtemplate.kt dengan pustaka standar tersemat
kotlinc rawtemplate.kt -include-runtime -d rawtemplate.jar
# jalankan program
java -jar rawtemplate.jarRata-rata kelas: 92Tanda $nilai pada baris tengah raw string diganti isi variabelnya sebagaimana string biasa, sehingga laporan yang tercetak memuat nilai terbaru. Kombinasi ini lazim dipakai untuk templat laporan dan dokumen, yaitu teks tetapnya ditulis sekali di dalam raw string, sedangkan bagian yang berubah disisipkan dengan template. Alternatif lain bernama trimMargin() menyediakan tanda batas yang dapat diatur, tetapi trimIndent() sudah cukup untuk kebanyakan kasus.
Raw string tidak menggantikan string biasa sepenuhnya. Untuk teks pendek satu baris, string biasa dengan kutip ganda tetap lebih ringkas, sedangkan raw string baru memberi manfaat ketika teksnya memuat tanda kutip, garis miring terbalik, atau memang tersusun atas banyak baris.
Ringkasan#
- Tanda dolar menyisipkan nama variabel ke dalam string, sedangkan
${...}menampung ekspresi arbitrer yang hasilnya dikonversi menjadi teks. - Tanda dolar literal ditulis dengan escape
\$, dan tanda dolar sebelum karakter non-identifier diperlakukan sebagai teks biasa. - Raw string dengan tiga tanda kutip mempertahankan baris baru, spasi, dan tanda kutip tanpa escape, serta tetap mendukung template.
- Fungsi
trimIndent()menghapus indentasi bersama pada raw string agar keluarannya rapi.
Referensi#
- Basic syntax — Kotlin Documentation — Dokumentasi resmi string template dan raw string pada bagian String templates.