nil dan truthiness

Nilai nil dan aturan truthiness Ruby yang hanya menganggap false dan nil sebagai falsy.

Daftar isi

nil adalah objek khusus yang mewakili ketiadaan nilai. Topik ini membahas perilaku nil sebagai objek, aturan truthiness Ruby dalam menilai kebenaran sebuah nilai pada pernyataan kondisional, serta pola penulisan kode yang aman ketika nil mungkin muncul. Ketiganya menutup rangkaian tipe data inti pada modul ini.

nil sebagai objek#

nil adalah satu-satunya instans (instance) dari kelas NilClass dan berperilaku sebagai objek biasa dengan metodenya sendiri. Nilai nil menyatakan tidak adanya nilai, dan istilah ini berakar dari kata null yang lazim digunakan pada bahasa pemrograman lain. Penulisannya dengan huruf kecil semua karena nil berstatus kata kunci yang merujuk satu objek tunggal, sedangkan bentuk seperti Nil bukan nilai nil. Metode nil? menanyakan apakah sebuah nilai adalah nil dan menjawab true atau false.

ruby Contoh: nil adalah objek
p nil
puts nil.class
puts nil.nil?
text Keluaran
nil
NilClass
true

Metode p pada potongan di atas menampilkan nilai dalam bentuk yang dilihat Ruby, sehingga nil terlihat jelas sebagai nil dan string tampil dengan tanda petik. Perilaku ini berbeda dari puts, yang menampilkan string tanpa tanda petik dan menampilkan nil sebagai baris kosong. Saat memeriksa perilaku program yang mencurigakan, p menjadi pilihan yang lebih teliti daripada puts.

Banyak operasi Ruby mengembalikan nil ketika hasil yang diminta tidak ada. Metode index pada string mengembalikan posisi potongan teks yang dicari, dan hasilnya bernilai nil apabila potongan itu tidak ditemukan. Memeriksa hasil semacam ini dengan nil? lebih aman daripada langsung menggunakannya.

ruby Contoh: pencarian yang tidak ditemukan menghasilkan nil
teks = "rubin"
p teks.index("bin")
p teks.index("xyz")
puts teks.index("xyz").nil?
text Keluaran
2
nil
true

Kenyataan yang jarang disadari adalah bahwa puts sendiri mengembalikan nil. Metode yang tugasnya hanya menampilkan keluaran tidak membawa nilai lain, sehingga nil yang dikembalikan. Penugasan variabel dari hasil puts menghasilkan nil, sebagaimana potongan berikut.

ruby Contoh: puts selalu mengembalikan nil
teks = puts "satu baris"
p teks
text Keluaran
satu baris
nil

Prinsip bahwa segala sesuatu adalah objek pun berlaku untuk pasangan nilai kebenaran. Nilai true dan false masing-masing adalah objek dari kelas TrueClass dan FalseClass, dan Ruby tidak memiliki kelas Boolean yang menyatukan keduanya.

ruby Contoh: true dan false adalah objek
puts true.class
puts false.class
text Keluaran
TrueClass
FalseClass

Aturan truthiness#

Dalam konteks kondisional, Ruby menilai false dan nil sebagai satu-satunya nilai yang salah, sedangkan semua nilai lain dinilai benar. Istilah truthiness menyatakan cara bahasa menilai kebenaran sebuah nilai di luar nilai true dan false itu sendiri. Nilai yang dinilai salah disebut falsy, sedangkan seluruh sisanya disebut truthy. Berkas berikut menguji tiga nilai yang sering dipertanyakan.

ruby truthiness.rb
# truthiness.rb
# Hanya false dan nil yang dianggap falsy oleh Ruby.

angka = 0
if angka
  puts "0 dianggap benar"
end

teks = ""
if teks
  puts "string kosong dianggap benar"
end

nilai = nil
if nilai
  puts "tidak pernah tampil"
else
  puts "nil dianggap salah"
end
text Keluaran
0 dianggap benar
string kosong dianggap benar
nil dianggap salah

Keluaran di atas menunjukkan bahwa 0 dan string kosong lolos uji kondisi dan dinilai benar. Aturan ini berbeda dari sejumlah bahasa lain yang menilai 0 sebagai salah, sehingga kebiasaan dari bahasa tersebut perlu dilepas ketika menulis Ruby. Tabel berikut meringkas penilaian tersebut.

NilaiPenilaian pada kondisi
falsesalah
nilsalah
0benar
"" (string kosong)benar

Pemeriksaan kebenaran tidak memerlukan perbandingan eksplisit terhadap true. Bentuk if angka sudah cukup untuk menilai sebuah variabel, sedangkan perbandingan angka == true menguji kesetaraan dengan true, sehingga hasilnya salah untuk nilai truthy lain seperti bilangan 1. Perbandingan seperti itu tetap digunakan ketika yang diminta memang kesetaraan nilai, bukan penilaian kebenarannya.

Menangani kemungkinan nil#

Ruby menyediakan tiga pola yang lazim untuk menghadapi nilai yang mungkin nil. Nilai semacam ini muncul secara alami, misalnya dari pencarian yang tidak ditemukan sebagaimana contoh di atas. Tiga pola tersebut adalah pemeriksaan eksplisit dengan nil?, pemberian nilai cadangan dengan operator ||, dan safe navigation melalui tanda &.. Pola ketiga melewati pemanggilan metode dan mengembalikan nil apabila penerimanya nil.

ruby Contoh: nilai cadangan dengan operator ||
nama = nil
sapaan = nama || "tanpa nama"
puts sapaan
text Keluaran
tanpa nama

Operator || mengambil nilai di kirinya apabila nilai itu dinilai benar, dan beralih ke nilai kanannya apabila tidak. Karena nil termasuk yang dinilai salah, variabel sapaan di atas menerima teks cadangannya. Pola ini digunakan untuk menetapkan nilai default tanpa menulis percabangan tersendiri.

Safe navigation meringkas pemeriksaan ke satu tanda. Tanda &. dipasang di antara penerima dan metodenya. Pada potongan berikut, pemanggilan upcase terhadap nil tidak memunculkan error, melainkan langsung bernilai nil.

ruby Contoh: safe navigation dengan tanda &.
nama = nil
p nama&.upcase
nama = "rubin"
p nama&.upcase
text Keluaran
nil
"RUBIN"

Tanpa &., pemanggilan metode pada nil menghentikan program dengan NoMethodError, yang merupakan salah satu error paling sering ditemui saat program berjalan. Safe navigation digunakan pada tempat yang kekosongannya memang wajar, bukan diselipkan pada setiap pemanggilan metode demi menutup semua kemungkinan. Keluaran "RUBIN" dengan tanda petik juga memperlihatkan kembali perbedaan p dan puts pada potongan sebelumnya.

Metode konversi juga tersedia pada nil. Pemanggilan nil.to_s menghasilkan string kosong, sehingga operasi yang menuntut string tetap berjalan meskipun sumbernya kosong. Meski demikian, menyembunyikan nil melalui konversi membuat sumber kekosongannya sulit dilacak, sehingga pemeriksaan eksplisit dengan nil? tetap menjadi kebiasaan yang lebih baik.

Ringkasan#

  • nil adalah satu-satunya instans NilClass dan berperilaku sebagai objek biasa dengan metode nil?.
  • Hanya false dan nil yang dinilai falsy, sedangkan 0, string kosong, dan nilai lainnya dinilai truthy.
  • Operator || memberi nilai cadangan, sedangkan tanda &. membatalkan pemanggilan metode pada penerima yang nil.
  • Metode p menampilkan nilai dalam bentuk yang dilihat Ruby, sehingga lebih teliti daripada puts saat memeriksa nil.

Referensi#