Symbol adalah objek yang mewakili sebuah nama di dalam program dan ditulis dengan awalan titik dua, misalnya :nama. Topik ini membahas perbedaan symbol dengan string, jaminan keunikan identitasnya, serta konteks yang membuat masing-masing menjadi pilihan yang tepat. Pemahaman ini mencegah kebingungan yang lazim muncul ketika :nama dan "nama" tampak serupa tetapi berperilaku berbeda.
Symbol sebagai nama#
Symbol mewakili nama, sedangkan string mewakili isi teks. Nilai :nama adalah objek Symbol yang berperilaku sebagai label tetap, bukan sebagai deretan karakter yang diolah. Awalan titik dua berperan sebagai penanda identitas, sehingga :kota dibaca sebagai nama kota, bukan sebagai teks yang dapat dipecah atau diganti isinya. Sebagai objek penuh, symbol pun memiliki metode, sejalan dengan prinsip bahwa segala sesuatu di Ruby adalah objek.
puts :nama
puts :nama.class
puts :nama.size
puts :nama.to_snama
Symbol
4
namaMetode size menghitung panjang nama symbol, sedangkan to_s mengubahnya menjadi string. Jalan sebaliknya juga tersedia, yaitu to_sym yang mengubah string menjadi symbol. Keduanya menjadi jembatan ketika satu bagian program bekerja dengan string dan bagian lain menuntut symbol. Symbol tidak memiliki metode pengolahan teks yang mengubah isinya, sehingga pengolahan seperti perubahan huruf selalu melewati konversi ke string terlebih dahulu.
Rangkaian berikut memperlihatkan jalur dua arah tersebut. String hasil konversi bebas diolah dengan metode string apa pun, sedangkan hasil konversi baliknya menjadi symbol yang identitasnya tetap unik.
simbol = :kota
teks = simbol.to_s
puts teks
puts teks.upcase
puts teks.to_symkota
KOTA
kotaIdentitas yang selalu unik#
Dua penulisan symbol yang sama selalu menunjuk satu objek yang sama, sedangkan dua string yang sama merupakan dua objek terpisah. Ruby mendaftarkan symbol sekali lalu menggunakannya bersama, sehingga keunikan identitasnya dijamin selama program berjalan. Metode object_id mengembalikan angka identitas setiap objek, dan dua objek dengan object_id yang sama adalah satu objek yang sama. Berkas berikut membandingkan keduanya.
# symbol.rb
# Membandingkan identitas symbol dan string.
puts :nama.class
puts :nama.object_id == :nama.object_id
puts "nama".object_id == "nama".object_id
puts :nama.to_s
puts "nama".to_sym
puts :nama.sizeSymbol
true
false
nama
nama
4Pada keluaran di atas, perbandingan object_id dua :nama bernilai true, sedangkan perbandingan object_id dua "nama" bernilai false. Artinya, setiap evaluasi literal string membuat objek baru, sedangkan penulisan symbol selalu mengarah pada objek yang telah terdaftar. Konsekuensinya, perbandingan dua symbol hanya membandingkan identitas, yang berlangsung cepat dan tidak dipengaruhi panjang namanya. Perbandingan string membandingkan isinya karakter demi karakter, sehingga biayanya bertambah seiring panjang teks.
Keunikan identitas ini juga berdampak pada memori. Penulisan :nama seribu kali tetap merujuk satu objek yang sama, sedangkan seribu penulisan string yang sama menghasilkan seribu objek terpisah. Bagi nama yang ditulis dan dibandingkan berulang-ulang di banyak tempat, symbol menjadi pilihan yang lebih hemat.
Angka yang dikembalikan object_id tidak perlu ditampilkan dalam program biasa karena nilainya bergantung pada keadaan memori. Yang bermakna adalah perbandingannya, bukan angkanya. Pola perbandingan pada berkas di atas dimaksudkan untuk memperlihatkan keunikan itu, sedangkan kode sehari-hari membandingkan symbol dengan == atau menggunakannya langsung sebagai kunci.
Kapan symbol, kapan string#
Pilihan antara symbol dan string ditentukan oleh peran nilainya, bukan oleh preferensi. Symbol dipilih ketika nilai berperan sebagai nama tetap di dalam kode, sedangkan string dipilih ketika nilai berperan sebagai teks yang dibaca, digabung, atau diubah. Tabel berikut meringkas pembagiannya.
| Peran nilai | Pilihan | Alasan |
|---|---|---|
| Label atau nama tetap di dalam kode | symbol | identitasnya unik dan perbandingannya cepat |
| Teks yang ditampilkan atau diolah | string | kaya metode pengolahan teks |
| Data yang datang dari luar program | string | masukan luar selalu berbentuk teks |
Kasus yang paling mudah dijumpai adalah symbol sebagai kunci hash. Hash sendiri adalah struktur pasangan kunci-nilai untuk menyimpan data berlabel. Kunci hash secara konvensi ditulis sebagai symbol karena kuncinya berperan sebagai nama bidang, bukan sebagai teks yang dibaca. Bentuk { nama: "Dewi", kota: "Bandung" } pada contoh berikut adalah jalan pintas penulisan hash, dan nama yang diikuti titik dua secara otomatis menjadi symbol. Kunci berbentuk string tetap mungkin ditulis, tetapi tidak dapat menggunakan jalan pintas tersebut.
profil = { nama: "Dewi", kota: "Bandung" }
puts profil[:nama]
puts profil[:kota]Dewi
BandungSebaliknya, teks yang berasal dari masukan pengguna, berkas, atau jaringan diperlakukan sebagai string karena bentuk aslinya memang teks. Data dari luar program dibiarkan berbentuk string, dan konversi ke symbol hanya dilakukan pada nama-nama yang terbatas dan diketahui sejak awal. Dengan pembagian peran ini, symbol menangani penamaan di dalam kode, sedangkan string menangani seluruh teks yang masuk dan keluar dari program.
Ruby juga menggunakan symbol sebagai nama metode yang dilewatkan kepada metode lain. Sejumlah metode pustaka standar menerima argumen berupa :upcase untuk merujuk metode upcase, dan pola ini konsisten dengan peran symbol sebagai nama di dalam program. Pembacaan kode Ruby pun menjadi lebih mudah karena setiap awalan titik dua langsung menunjuk pada sebuah nama tetap.
Ringkasan#
- Symbol adalah objek nama yang ditulis dengan awalan titik dua, sedangkan string adalah objek teks.
- Dua penulisan symbol yang sama menunjuk satu objek yang sama, sedangkan dua string yang sama adalah dua objek terpisah.
- Symbol digunakan sebagai nama tetap, misalnya kunci hash, sedangkan string digunakan untuk teks yang ditampilkan atau diolah.
- Konversi dua arah tersedia melalui
to_sdanto_sym.
Referensi#
- Symbol — Ruby Documentation — Daftar metode Symbol beserta penjelasan sifat keunikannya.
- String — Ruby Documentation — Perbandingan perilaku metode String yang menjadi kontras dengan Symbol.