2010-09-24 15 views
10
>> current_user.first_visit 
=> 0 
>> if current_user.first_visit 
>> puts "test" 
>> end 
test 
=> nil 

यह परीक्षण क्यों प्रिंट करता है?रूबी में "शून्य" क्यों नहीं कर सकता?

+0

से मेल खाता है ऐसा लगता है कि आपके प्रश्न का उत्तर दिया गया है। लेकिन आपको वास्तविक/गलत के लिए संख्यात्मक मानों का उपयोग करना बंद कर देना चाहिए। यदि आपकी भाषा उनका समर्थन करती है तो कीवर्ड सही और गलत का उपयोग करें – colithium

+0

रेल ने पूर्णांक प्रकार बढ़ाया है। आप "अगर current_user.first_visit.zero" का भी उपयोग कर सकते हैं? – vise

+1

@ vise: '.zero? 'सादा पुरानी रूबी है: [APIdock.com लिंक] (http://apidock.com/ruby/v1_8_6_287/Numeric/zero%3F) –

उत्तर

16

रूबी में केवल 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" 
+1

कृपया ध्यान दें कि '.blank? ',' .empty?' रेल फ्रेमवर्क ('activesupport' के माध्यम से) द्वारा प्रदान किए गए एक्सटेंशन हैं और रूबी स्टैंडर्ड या कोर लिब में उपलब्ध नहीं हैं। इसके अलावा अलग-अलग व्यवहार इसलिए है क्योंकि "# {false}" 'to_s' विधि को कॉल करता है। – Swanand

+2

@swanand: 'शून्य? 'और' खाली?' मूल lib में हैं (सुनिश्चित नहीं है कि आपके पास कौन सी कक्षाएं हैं, हालांकि)। –

+0

@ पीडोम का संपादन सही था। आईडीके, दूसरों ने इसे क्यों खारिज कर दिया। http://stackoverflow.com/review/suggested-edits/7845176 – Nakilon

6

आप रूबी के यदि या तो एक बूलियन, या उपलब्धता के लिए परीक्षण के रूप में सोच सकते हैं डेटा (बनाम 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 
1

आप कोशिश कर सकते हैं इस

>> current_user.first_visit 
=> 0 
>> if current_user.first_visit != 0 
>> puts "test" 
>> else 
>> puts "fail" 
>> end 
fail 
=>nil 

जब संख्यात्मक मान के लिए जाँच आप भी करने की जरूरत है अपेक्षित मूल्य

संबंधित मुद्दे

 संबंधित मुद्दे