>> current_user.first_visit
=> 0
>> if current_user.first_visit
>> puts "test"
>> end
test
=> nil
यह परीक्षण क्यों प्रिंट करता है?रूबी में "शून्य" क्यों नहीं कर सकता?
>> current_user.first_visit
=> 0
>> if current_user.first_visit
>> puts "test"
>> end
test
=> nil
यह परीक्षण क्यों प्रिंट करता है?रूबी में "शून्य" क्यों नहीं कर सकता?
रूबी में केवल nil
को false
पर एनालॉग के रूप में माना जा सकता है। कोई धारणा है कि 0
, ""
या []
मतलब है false
, नहीं है, इसलिए आप == 0
, .blank?
, .empty?
, .zero?
, आदि
लेकिन nil
हमेशा false
के रूप में व्यवहार नहीं करता है का उपयोग करना चाहिए। उदाहरण के लिए, स्ट्रिंग प्रक्षेप में, .to_s
विधि #{}
सामग्री, कि FalseClass
और NilClass
के लिए अलग काम करती है पर लागू होता है:
irb(main)> "qwe #{false} rty"
=> "qwe false rty"
irb(main)> "qwe #{nil} rty"
=> "qwe rty"
कृपया ध्यान दें कि '.blank? ',' .empty?' रेल फ्रेमवर्क ('activesupport' के माध्यम से) द्वारा प्रदान किए गए एक्सटेंशन हैं और रूबी स्टैंडर्ड या कोर लिब में उपलब्ध नहीं हैं। इसके अलावा अलग-अलग व्यवहार इसलिए है क्योंकि "# {false}" 'to_s' विधि को कॉल करता है। – Swanand
@swanand: 'शून्य? 'और' खाली?' मूल lib में हैं (सुनिश्चित नहीं है कि आपके पास कौन सी कक्षाएं हैं, हालांकि)। –
@ पीडोम का संपादन सही था। आईडीके, दूसरों ने इसे क्यों खारिज कर दिया। http://stackoverflow.com/review/suggested-edits/7845176 – Nakilon
आप रूबी के यदि या तो एक बूलियन, या उपलब्धता के लिए परीक्षण के रूप में सोच सकते हैं डेटा (बनाम nil
)। 0 से झूठे से अंतर्निहित रूपांतरण सी और (इसलिए सी ++ जैसी अन्य भाषाएं) सी के विशिष्ट बूलियन प्रकार के कुछ दिन पहले से ही एक ऐतिहासिक आर्टेफैक्ट था। वहां, यह एक सुविधाजनक सेंटीनेल मूल्य होने या अंतर्ज्ञानी अर्थ होने पर 0 पर निर्भर करता है। कई चीजों के लिए (उदाहरण के लिए कुछ देश जहां कपड़ों के आकार 0 से 8 तक होते हैं, पीओएसआईक्स libC फ़ंक्शन कॉल परिणाम) शून्य अच्छी तरह से तर्कसंगत समकक्ष बूलियन में परिवर्तित नहीं होता है, इसलिए यह एक बुरी बात नहीं है कि रूबी अपना रास्ता चलाती है।
इस परिप्रेक्ष्य से, आपके कोड के साथ समस्या यह है कि current_user.first_visit - जिसका नाम एक बूलियन प्रकार का तात्पर्य है - वास्तव में 0 है और झूठी नहीं है। वैकल्पिक रूप से, अगर आप स्पष्ट रूप से संख्यात्मक current_user.visit_counter था, यह स्वाभाविक है और सही में से एक का उपयोग करने के होगा:
current_user.visit_counter > 0
current_user.visit_counter >= 1
current_user.visit_counter != 0
आप कोशिश कर सकते हैं इस
>> current_user.first_visit
=> 0
>> if current_user.first_visit != 0
>> puts "test"
>> else
>> puts "fail"
>> end
fail
=>nil
जब संख्यात्मक मान के लिए जाँच आप भी करने की जरूरत है अपेक्षित मूल्य
से मेल खाता है ऐसा लगता है कि आपके प्रश्न का उत्तर दिया गया है। लेकिन आपको वास्तविक/गलत के लिए संख्यात्मक मानों का उपयोग करना बंद कर देना चाहिए। यदि आपकी भाषा उनका समर्थन करती है तो कीवर्ड सही और गलत का उपयोग करें – colithium
रेल ने पूर्णांक प्रकार बढ़ाया है। आप "अगर current_user.first_visit.zero" का भी उपयोग कर सकते हैं? – vise
@ vise: '.zero? 'सादा पुरानी रूबी है: [APIdock.com लिंक] (http://apidock.com/ruby/v1_8_6_287/Numeric/zero%3F) –