Ruby'nin evrensel bir " doğruluk " ve " yanlışlık " fikri vardır .
Yakut yapar Boole nesneler için iki özel sınıfı bulunmakta, TrueClassve FalseClassözel değişken ile gösterilen tekil örnekleri ile trueve falsesırasıyla.
Ancak, doğruluk ve sahtelik bu iki sınıfın örnekleriyle sınırlı değildir, kavram evrenseldir ve Ruby'deki her bir nesne için geçerlidir. Her nesne ya doğrudur ya da sahtedir . Kurallar çok basit. Özellikle, sadece iki nesne yanlıştır :
nil,NilClassvefalse, tekil örneğiFalseClass
Her bir diğer nesne olduğunu truthy . Bu kabul edilir hatta nesneleri içeren falsy gibi diğer programlama dillerinde,
Bu kurallar dile dahil edilmiştir ve kullanıcı tarafından tanımlanamaz. to_boolÖrtük dönüşüm veya benzeri bir şey yoktur .
İşte ISO Ruby Dil Şartnamesi'nden bir alıntı :
6.6 Boole değerleri
Bir amacı, bir ya da sınıflandırılır trueish nesne ya da bir falseish nesne .
Yalnızca yanlış ve sıfır , sahte nesnelerdir. Yanlış sınıf yalnızca örneği
FalseClassbir (15.2.6 bakınız), buna ters sentezleme değerlendirir (11.5.4.8.3 bakınız). nil ,NilClassbir nil-ifadesinin değerlendirdiği (bkz. 11.5.4.8.2) sınıfın tek örneğidir (bkz. 15.2.4).Dışındaki nesneleri FALSE ve sıfır trueish nesneler sınıflandırılır. Gerçek sınıfın tek örneği
TrueClass, bir (15.2.5 bakınız), buna doğru ifade değerlendirir (11.5.4.8.3 bakınız).
Yürütülebilir Ruby / Spec aynı fikirde :
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
Bu iki kaynağa göre, Regexps'nin de doğru olduğunu varsayabilirim , ancak testlerime göre, bunlar değil:
if // then 'Regexps are truthy' else 'Regexps are falsy' end
#=> 'Regexps are falsy'
Bunu YARV 2.7.0-önizleme1 , TruffleRuby 19.2.0.1 ve JRuby 9.2.8.0'da test ettim . Her üç uygulama da birbiriyle hemfikir ve ISO Ruby Dil Şartnamesi ile Ruby / Spec hakkındaki yorumumla aynı fikirde değil.
Daha doğrusu, değişmez değerleri Regexpdeğerlendirmenin sonucu olan nesneler sahtedir , oysa başka bir ifadenin sonucu olan nesneler doğrudur :Regexp Regexp
r = //
if r then 'Regexps are truthy' else 'Regexps are falsy' end
#=> 'Regexps are truthy'
Bu bir hata mı yoksa istenen davranış mı?
!!//yanlıştır ama !!/r/doğrudur. Gerçekten garip.
!!/r/üretiyor false.
//içinde if // thenbir test (için kısayol olarak yorumlanır if //=~nil then) bir Normal ifade örneği olarak değil, (yani falsy ne desen her zaman).
Regex.new("a")doğru.