Ruby memiliki gagasan universal tentang " kebenaran " dan " kepalsuan ".
Ruby memang memiliki dua kelas khusus untuk objek Boolean, TrueClass
dan FalseClass
, dengan instance tunggal dilambangkan oleh variabel khusus true
dan 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 dariNilClass
danfalse
, 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_bool
konversi 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 Regexp
s 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, Regexp
benda-benda yang merupakan hasil dari evaluasi Regexp
literal adalah falsy , sedangkan Regexp
benda-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 false
untuk saya menggunakan (RVM) Ruby 2.4.1.
//
dalam if // then
diartikan sebagai tes (jalan pintas untuk if //=~nil then
) (yang selalu salah pola apa pun) dan bukan sebagai contoh Regexp.
Regex.new("a")
adalah kebenaran.