Ruby memiliki gagasan universal tentang " kebenaran " dan " kepalsuan ".
Ruby memang memiliki dua kelas khusus untuk objek Boolean, TrueClassdan FalseClass, dengan instance tunggal dilambangkan oleh variabel khusus truedan false, masing-masing.
Namun, kebenaran dan kepalsuan tidak terbatas pada contoh dua kelas itu, konsepnya bersifat universal dan berlaku untuk setiap objek tunggal di Ruby. Setiap objek adalah baik truthy atau falsy . Aturannya sangat sederhana. Secara khusus, hanya dua objek yang palsu :
nil, contoh tunggal dariNilClassdanfalse, contoh tunggal dariFalseClass
Setiap objek tunggal lainnya adalah truthy . Ini termasuk objek genap yang dianggap falsy dalam bahasa pemrograman lain, seperti
Aturan-aturan ini dibangun ke dalam bahasa dan tidak dapat didefinisikan pengguna. Tidak ada to_boolkonversi tersirat atau yang serupa.
Berikut ini kutipan dari Spesifikasi Bahasa Ruby ISO :
6.6 Nilai Boolean
Suatu objek diklasifikasikan menjadi objek trueish atau objek falseish .
Hanya false dan nil yang merupakan objek falseish. false adalah satu-satunya instance dari kelas
FalseClass(lihat 15.2.6), di mana ekspresi-palsu mengevaluasi (lihat 11.5.4.8.3). nil adalah satu-satunya instance dari kelasNilClass(lihat 15.2.4), yang dievaluasi nil-ekspresi (lihat 11.5.4.8.2).Objek selain false dan nil diklasifikasikan menjadi objek trueish. true adalah satu-satunya instance dari kelas
TrueClass(lihat 15.2.5), yang dievaluasi oleh ekspresi-sejati (lihat 11.5.4.8.3).
Ruby / Spec yang dapat dieksekusi tampaknya setuju :
it "considers a non-nil and non-boolean object in expression result as true" do if mock('x') 123 else 456 end.should == 123 end
Menurut dua sumber, saya akan berasumsi bahwa Regexps juga truthy , tetapi menurut tes saya, mereka tidak:
if // then 'Regexps are truthy' else 'Regexps are falsy' end
#=> 'Regexps are falsy'
Saya menguji ini pada YARV 2.7.0-preview1 , TruffleRuby 19.2.0.1 , dan JRuby 9.2.8.0 . Ketiga implementasi setuju satu sama lain dan tidak setuju dengan Spesifikasi Bahasa Ruby ISO dan interpretasi saya terhadap Ruby / Spec.
Lebih tepatnya, Regexpbenda-benda yang merupakan hasil dari evaluasi Regexp literal adalah falsy , sedangkan Regexpbenda-benda yang merupakan hasil dari beberapa ekspresi lainnya adalah truthy :
r = //
if r then 'Regexps are truthy' else 'Regexps are falsy' end
#=> 'Regexps are truthy'
Apakah ini bug, atau perilaku yang diinginkan?
!!//itu salah tetapi !!/r/itu benar. Memang aneh.
!!/r/menghasilkan falseuntuk saya menggunakan (RVM) Ruby 2.4.1.
//dalam if // thendiartikan sebagai tes (jalan pintas untuk if //=~nil then) (yang selalu salah pola apa pun) dan bukan sebagai contoh Regexp.
Regex.new("a")adalah kebenaran.