रूबी "की एक सार्वभौमिक विचार है truthiness " और " falsiness "।
रूबी करता बूलियन वस्तुओं के लिए दो विशिष्ट वर्गों है, TrueClass
और FalseClass
, विशेष चरों से निरूपित किया सिंगलटन उदाहरणों के साथ true
और false
, क्रमशः।
हालांकि, truthiness और falsiness उन दो वर्गों के उदाहरण तक सीमित नहीं हैं, अवधारणा है सार्वभौमिक और रूबी में हर वस्तु पर लागू होता। प्रत्येक वस्तु या तो सत्य है या मिथ्या है । नियम बहुत सरल हैं। विशेष रूप से, केवल दो वस्तुएं मिथ्या हैं :
nil
, का एकल उदाहरणNilClass
औरfalse
का एकल उदाहरणFalseClass
हर एक अन्य वस्तु है truthy । इसमें ऐसी वस्तुएं भी शामिल हैं जिन्हें अन्य प्रोग्रामिंग भाषाओं में गलत माना जाता है , जैसे कि
ये नियम भाषा में निर्मित हैं और उपयोगकर्ता-निश्चित नहीं हैं। कोई to_bool
अंतर्निहित रूपांतरण या कुछ भी समान नहीं है।
यहाँ आईएसओ रूबी भाषा विशिष्टता से एक उद्धरण है :
6.6 बूलियन मूल्य
एक वस्तु को एक सत्य वस्तु या एक झूठी वस्तु में वर्गीकृत किया जाता है ।
केवल झूठी और शून्य झूठी वस्तुएं हैं। झूठी कक्षा का एकमात्र उदाहरण है
FalseClass
(देखें 15.2.6), जिसके लिए झूठी अभिव्यक्ति का मूल्यांकन होता है (देखें 11.5.4.8.3)। नील वर्ग का एकमात्र उदाहरण हैNilClass
(देखें 15.2.4), जिसके लिए एक नील-अभिव्यक्ति का मूल्यांकन होता है (देखें 11.5.4.8%)।झूठी और शून्य के अलावा अन्य वस्तुओं को सत्य वस्तुओं में वर्गीकृत किया जाता है। सत्य कक्षा का एकमात्र उदाहरण है
TrueClass
(देखें 15.2.5), जिसके लिए एक सच्चे-अभिव्यक्ति का मूल्यांकन होता है (देखें 11.5.4.8.3)।
निष्पादन योग्य रूबी / युक्ति से सहमत प्रतीत होता है :
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
उन दो स्रोतों के अनुसार, मुझे लगता है कि Regexp
एस भी सत्य हैं , लेकिन मेरे परीक्षणों के अनुसार, वे नहीं हैं:
if // then 'Regexps are truthy' else 'Regexps are falsy' end
#=> 'Regexps are falsy'
मैंने इसका परीक्षण YARV 2.7.0-Preview1 , TruffleRuby 19.2.0.1 , और JRuby 9.2.8.0 पर किया । सभी तीन कार्यान्वयन एक दूसरे के साथ सहमत हैं और आईएसओ रूबी भाषा विशिष्टता और रूबी / युक्ति की मेरी व्याख्या से असहमत हैं।
अधिक सटीक रूप से, ऐसी Regexp
वस्तुएं जो Regexp
शाब्दिक रूप से मूल्यांकन करने का परिणाम होती हैं , मिथ्या होती हैं , जबकि वे Regexp
वस्तुएं जो किसी अन्य अभिव्यक्ति का परिणाम हैं, सत्य हैं :
r = //
if r then 'Regexps are truthy' else 'Regexps are falsy' end
#=> 'Regexps are truthy'
यह एक बग, या वांछित व्यवहार है?
!!//
गलत है लेकिन !!/r/
सच है। वास्तव में अजीब।
!!/r/
करता है false
।
//
में if // then
एक परीक्षण (के लिए एक शॉर्टकट के रूप में समझा जाता है if //=~nil then
एक Regexp उदाहरण के रूप में और नहीं (कि हमेशा falsy जो कुछ पैटर्न है))।
Regex.new("a")
सच्चाई है।