2010-03-04 12 views
6

संभव डुप्लिकेट:
Ruby: difference between || and ‘or’रुबी: तुलनात्मकताओं के बीच क्या अंतर है: "||" और "या"

रूबी

|| 

और

or 

का उपयोग करना बहुत ही आम prac हैं दुर्भाग्यवश दुर्भाग्यवश के बीच अंतर को जानना महत्वपूर्ण है, मुझे यकीन नहीं है।

सबसे पहले मेरे सवाल है, तो निम्न धारणा सही है है:

EX1:

if @variable_1 || @variable_2 || @variable_3 
    do something 
else 
    do nothing 
end 

EX2:

if @variable_1 or @variable_2 or @variable_3 
    do something 
else 
    do nothing 
end 

तो पहले उदाहरण में यदि कोई चर तो गलत है यह "कुछ भी नहीं" निष्पादित करेगा

हालांकि, दूसरे उदाहरण के लिए सभी भिन्नताएं ables की जांच की जाती है और यदि कोई सच है तो यह "कुछ करें" निष्पादित करेगा।

सारांश में "||" यदि आपके पास चर की एक सूची है जिसे जांचने की आवश्यकता है और यदि उनमें से कोई झूठी वापसी करता है तो ध्वज ऊपर जाता है। वेरिएबल की सूची के साथ दूसरा उदाहरण का उपयोग करें जहां वांछित कोड को निष्पादित करने के लिए केवल एक को सत्य होना चाहिए।

क्या ये धारणाएं सही हैं?

+0

http://StackOverflow.Com/questions/2083112/ और http://StackOverflow.Com/questions/1625946/ का सटीक डुप्लिकेट। अर्थात् http://StackOverflow.Com/questions/1426826/ और http://StackOverflow.Com/questions/1840488/ के समतुल्य समकक्ष। इसके अलावा (कुछ हद तक) http://StackOverflow.Com/questions/1434842/ में उत्तर दिया। गंभीरता से? रुबी भाषा में पृथ्वी-टूटने वाले बदलावों ने पिछले 6 हफ्तों में क्या किया है कि इस प्रश्न के उत्तर में बार-बार जवाब देने की आवश्यकता है? –

+0

@ जोर्ग: मैं उम्मीद करता हूं कि एसओ नियमित रूप से यह जान लें कि इससे पहले पूछा गया है, लेकिन मैं किसी नौसिखिया से आश्चर्यचकित नहीं हूं कि संबंधित प्रश्नों को Google पर नहीं जा रहा है। –

उत्तर

14

या दूसरा उदाहरण सभी चर चेक किए गए हैं और यदि कोई सत्य है तो यह "कुछ करें" निष्पादित करेगा।

यह झूठी वाक्य है।

नतीजतन आपकी धारणाएं सही नहीं हैं।

or और || दोनों एक ही काम करते हैं।

मुख्य अंतर यह है कि or|| से कम प्राथमिकता है। इसलिए आपको अधिक जटिल मूल्यांकनों पर ध्यान देना चाहिए:

# Simple cases are not confusing 
false || true # true 
false or true # true 

# This is more complex 
a = false || true # a=true 
a = false or true # a=false 

# Also similarly as 1 + 2*3 returns 7, the following returns true: 
false or false||true # true 
# BUT! THIS IS IMPORTANT! 
a = false or false||true # a=false 
a = (false or false||true) # a=true 

यहां operators precedence की एक सूची है।

तो असली अंतर पर ध्यान दिया जाएगा अगर आप अभिव्यक्ति निम्नलिखित ऑपरेटरों के किसी भी शामिल है कि का उपयोग करें:

  • .. ... - रेंज (समावेशी और अनन्य)
  • ? : - त्रिगुट अगर-तो-और कुछ
  • = %= { /= -= += |= &= >>= <<= *= &&= ||= **= - असाइनमेंट
  • defined? - अगर निर्दिष्ट प्रतीक परिभाषित
  • not की जाँच करें - तार्किक निषेध
  • and - तार्किक संरचना

वहाँ दूसरों को भी हो सकता है।

आप कर सकते हैं + और * के बीच के रूप में विभिन्न लोगों के बीच अंतर के बारे में बात: || == * और or = +। यह and और not पर लागू होता है।

आपको वास्तव में उस पर ध्यान देना चाहिए।

व्यक्तिगत रूप से मैं || ऑपरेटर पसंद करता हूं क्योंकि इसके अर्थशास्त्र अच्छी तरह से समझते हैं और or से बचते हैं।

जबकि यह 'लगता है' जैसे or कई मामलों में अधिक अनुकूल है (मेरा कोड नमूना देखें), यहां तक ​​कि तुच्छ में भी, यह बग का स्रोत है।

+0

आपका उत्तर मेरी तुलना में काफी बेहतर है! मैं गैर-रूबीस्टिस्ट (और गैर-perl..ers?) के लिए जोड़ता हूं कि 'या' मुख्य रूप से ऐसी स्थितियों में उपयोग किया जाता है जैसे: x = get_some_string या ""। इस स्थिति में 'get_some_string' शून्य या अन्य' झूठी 'मान वापस कर सकता है और एक्स खाली स्ट्रिंग बन जाएगा। दिमित्री की तरह, हालांकि, '||' यहां भी पूरी तरह से अच्छी तरह से काम करता है, यह सिर्फ एक सम्मेलन है जिसे आप कभी-कभी रूबी दुनिया में देखेंगे (शायद यह पेर्ल से एक वाहक है)। – rfunduk

+0

@thenduks: "x खाली स्ट्रिंग बन जाएगा" नहीं, यह नहीं होगा। यदि आप 'x = nil या" "' करते हैं, तो x 'nil' होगा, न कि' '"। '" "बस अभिव्यक्ति का लौटा मूल्य होगा। – sepp2k

+0

हम्म काफी सही है, '=' 'या' की तुलना में कड़ा बांधता है ...मेरा उदाहरण एक गरीब था, तो। – rfunduk

4

वे एक ही बात करते हैं, लेकिन or|| की तुलना में कम पूर्वता है (और, वास्तव में, or अन्य ऑपरेटरों की तुलना में सबसे कम पूर्वता है)।

+0

वे वही काम नहीं करते हैं क्योंकि कोड का एक ही ब्लॉक एक अलग आउटपुट प्रस्तुत करेगा। – s84

+0

निचली प्राथमिकता से आपका क्या मतलब है? – s84

+1

प्राथमिकता संचालन के क्रम को परिभाषित करती है। उदाहरण के लिए, '*' '' 'की तुलना में अधिक प्राथमिकता है, इसलिए अभिव्यक्ति '1 + 2 * 3' रिटर्न' 7' है क्योंकि गुणा पहले किया जाता है। – mipadi

1

उदाहरणों के बारे में आपके निष्कर्ष गलत हैं।

if true || true || false 
    puts 'something' 
else 
    puts 'nothing' 
end 

यह कोड 'कुछ' आउटपुट करता है क्योंकि इस तरह 'तार्किक या' ऑपरेशन काम करता है। यह पढ़ता है "अगर कम से कम एक शर्त 1 या condition2 या condition3 सत्य हैं ..."।

दूसरा उदाहरण बिल्कुल वही है, लेकिन केवल rules of precedence in Ruby की वजह से।

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