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, TrueClass
ve FalseClass
özel değişken ile gösterilen tekil örnekleri ile true
ve false
sı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
,NilClass
vefalse
, 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
FalseClass
bir (15.2.6 bakınız), buna ters sentezleme değerlendirir (11.5.4.8.3 bakınız). nil ,NilClass
bir 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, Regexp
s'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 Regexp
değ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 // then
bir 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.