Hash

Pasangan kunci-nilai pada Hash, kunci symbol versus string, dan pengambilan nilai aman dengan fetch.

Daftar isi

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.

ruby suhu-kota.rb
# 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 suhu
text Keluaran
24
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.

ruby Kunci symbol dan kunci string adalah kunci berbeda
rekap = { "Ali" => 85, :citra => 90 }

p rekap["Ali"]
p rekap[:Ali]
p rekap["citra"]
p rekap[:citra]
p rekap.length
text Keluaran
85
nil
nil
90
2

Bentuk "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.

ruby Pengambilan nilai dengan fetch
suhu = { jakarta: 31, bandung: 24 }

p suhu.fetch(:bandung)
p suhu.fetch(:surabaya, 0)
p suhu.fetch(:surabaya) { |kunci| "Data #{kunci} belum tersedia" }
text Keluaran
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.

ruby fetch tanpa nilai cadangan memunculkan KeyError
# 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.

ruby Membaca kunci yang tidak ada
stok = { pulpen: 12, buku: 8 }
kunci = :penghapus

p stok[kunci]
p stok[kunci].nil?
p stok[kunci] || 0
text Keluaran
nil
true
0

Pola 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.

ruby Mencari dengan bentuk kunci yang salah
suhu = { bandung: 24 }

p suhu["bandung"]
p suhu[:bandung]
text Keluaran
nil
24

Hasil 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.
  • :bandung dan "bandung" adalah kunci berbeda, sehingga pencarian hanya berhasil apabila bentuk kuncinya persis sama.
  • fetch mengambil nilai dengan pemeriksaan ketat, menerima nilai cadangan, atau menjalankan blok untuk kunci yang tidak ada.
  • keys, values, size, dan delete melihat 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.