Hash menyimpan kumpulan pasangan kunci (key) dan nilai (value) serta mengambil nilai berdasarkan kuncinya, bukan berdasarkan posisi. Topik ini membahas pembuatan Hash, perbedaan kunci symbol dan kunci string, serta pengambilan nilai aman dengan fetch. Setelah membacanya, data berlabel seperti rekap suhu kota atau daftar stok dapat disimpan dan dibaca tanpa bergantung pada urutan posisi.
Pasangan kunci-nilai#
Hash ditulis di dalam tanda kurung kurawal dengan bentuk kunci: nilai, dan nilainya dibaca dengan meletakkan kunci di dalam tanda kurung siku. Nama kunci pada bentuk tersebut ditulis sebagai symbol, yaitu nama berawalan titik dua yang sudah diperkenalkan pada pembahasan tentang symbol. Penugasan dengan kunci baru menambah pasangan, sedangkan penugasan pada kunci yang sudah ada memperbarui nilainya, dan delete menghapus pasangan sekaligus mengembalikan nilai pasangan yang dihapus.
# Rekam suhu beberapa kota dalam Hash.
suhu = { jakarta: 31, bandung: 24, semarang: 28 }
p suhu[:bandung]
p suhu.size
suhu[:surabaya] = 30
p suhu
suhu[:bandung] = 25
p suhu[:bandung]
suhu.delete(:semarang)
p suhu.keys
p suhu.values
p suhu24
3
{jakarta: 31, bandung: 24, semarang: 28, surabaya: 30}
25
[:jakarta, :bandung, :surabaya]
[31, 25, 30]
{jakarta: 31, bandung: 25, surabaya: 30}Keluaran di atas memperlihatkan siklus lengkap satu hash, yaitu pembacaan, penambahan, pembaruan, dan penghapusan. Metode size menghitung jumlah pasangan, sedangkan keys dan values mengembalikan sisi kunci dan sisi nilai sebagai array. Perhatikan bahwa pembaruan suhu[:bandung] = 25 tidak menambah pasangan baru, melainkan mengganti nilai kunci yang sudah ada.
Kunci symbol dan kunci string#
Kunci symbol dan kunci string diperlakukan sebagai dua kunci yang berbeda, meskipun tulisannya hampir sama. Symbol :bandung adalah nama yang dijamin unik dan lazim digunakan sebagai label internal program, sedangkan string "bandung" adalah teks biasa yang cocok untuk data yang berasal dari luar program, misalnya berkas konfigurasi atau data terstruktur. Hash pun tetap dapat memuat keduanya sekaligus, tetapi pencarian hanya berhasil apabila bentuk kuncinya persis sama.
rekap = { "Ali" => 85, :citra => 90 }
p rekap["Ali"]
p rekap[:Ali]
p rekap["citra"]
p rekap[:citra]
p rekap.length85
nil
nil
90
2Bentuk "Ali" => 85 menggunakan kunci string dengan pemisah =>, karena sintaks kunci: nilai hanya berlaku untuk symbol. Pencarian rekap[:Ali] dan rekap["citra"] menghasilkan nil karena bentuk kuncinya tidak ada, meskipun tulisannya mirip dengan kunci yang tersedia. Jumlah pasangan tetap dua karena "Ali" dan :citra dihitung sebagai dua kunci yang berbeda.
Pengambilan nilai aman dengan fetch#
Metode fetch mengambil nilai berdasarkan kunci dan menuntut keberadaan kunci tersebut, yaitu memunculkan KeyError apabila kunci tidak ditemukan, kecuali nilai cadangan atau blok diberikan. Bentuk pertamanya menerima satu argumen kunci, bentuk kedua menerima nilai cadangan sebagai argumen kedua, sedangkan bentuk ketiga menerima blok yang dijalankan hanya apabila kunci tidak ada.
suhu = { jakarta: 31, bandung: 24 }
p suhu.fetch(:bandung)
p suhu.fetch(:surabaya, 0)
p suhu.fetch(:surabaya) { |kunci| "Data #{kunci} belum tersedia" }24
0
"Data surabaya belum tersedia"Blok pada bentuk ketiga menerima kunci yang tidak ditemukan sebagai argumen, sehingga pesan yang dihasilkan dapat menyebutkan kunci tersebut secara langsung. Pilih bentuk sesuai kebutuhan, yaitu nilai cadangan untuk angka yang boleh dianggap nol dan blok untuk pesan yang lebih deskriptif.
Bentuk tanpa nilai cadangan dan tanpa blok akan memunculkan KeyError dengan pesan key not found: :surabaya.
# tidak-dijalankan
suhu = { jakarta: 31 }
suhu.fetch(:surabaya)Kesalahan umum#
Kesalahan pertama adalah memperlakukan hasil pembacaan kunci yang tidak ada seolah-olah sebuah angka. Tanda kurung siku tidak memunculkan error saat kunci tidak ditemukan, melainkan mengembalikan nil, sehingga kerusakan baru terlihat pada baris lain.
stok = { pulpen: 12, buku: 8 }
kunci = :penghapus
p stok[kunci]
p stok[kunci].nil?
p stok[kunci] || 0nil
true
0Pola stok[kunci] || 0 menyediakan nilai cadangan tanpa perlu memeriksa keanggotaan kunci terlebih dahulu.
Kesalahan kedua adalah mencari dengan bentuk kunci yang berbeda dari yang disimpan. Program berikut menyimpan kunci symbol, tetapi mencarinya dengan string.
suhu = { bandung: 24 }
p suhu["bandung"]
p suhu[:bandung]nil
24Hasil nil pada baris pertama bukan karena datanya hilang, melainkan karena "bandung" dan :bandung adalah dua kunci yang berbeda. Periksa bentuk kunci yang tersimpan melalui keys apabila pencarian terus menghasilkan nil.
Ringkasan#
- Hash menyimpan pasangan kunci-nilai, ditulis
{kunci: nilai}untuk kunci symbol, dan nilainya dibaca dengan tanda kurung siku. :bandungdan"bandung"adalah kunci berbeda, sehingga pencarian hanya berhasil apabila bentuk kuncinya persis sama.fetchmengambil nilai dengan pemeriksaan ketat, menerima nilai cadangan, atau menjalankan blok untuk kunci yang tidak ada.keys,values,size, dandeletemelihat serta mengatur isi hash dari sisi kunci maupun nilai.
Referensi#
- Hash — Ruby — Dokumentasi resmi Hash beserta aturan kunci, pengambilan nilai, dan metodenya.
- Hash#fetch — Ruby — Dokumentasi fetch beserta bentuk nilai cadangan dan bentuk bloknya.