रूबी में "और" और && के बीच अंतर?


जवाबों:


348

andके रूप में ही है, &&लेकिन कम पूर्वता के साथ । वे दोनों शॉर्ट-सर्किट मूल्यांकन का उपयोग करते हैं ।

चेतावनी: andयहाँ तक कि =आप आमतौर पर बचना चाहते हैं की तुलना में कम पूर्वता है and। एक उदाहरण जब andउपयोग किया जाना चाहिए, तो " डबल रेंडर एरर्स से बचना " के तहत रेल गाइड में पाया जा सकता है ।


50
यह निर्दिष्ट करना एक अच्छा विचार होगा कि किसी को आमतौर पर उपयोग करना चाहिए &&, जबकि andइसका उपयोग केवल बहुत विशिष्ट मामलों के लिए किया जाना चाहिए।
मार्क-आंद्रे लाफ्यून 3

10
यहाँ एक और अच्छी व्याख्या: devblog.avdi.org/2010/08/02/using-and-and-or-in-ruby
एंड्रयू मार्शल

17
एंड्रयू मार्शल के लिंक से: "सोचने का एक और तरीका andउलटा ifबयान संशोधक के रूप में है : next if widget = widgets.popबन जाता है widget = widgets.pop and next। यह डालने का एक शानदार तरीका है, वास्तव में इसे मेरे सिर में" क्लिक करें "। (और orएक उलट unlessसंशोधक की तरह है ।)
बीएमडब्ल्यू

1
इस उत्तर को टैडमैन के उत्तर के विवरण के साथ मिलाएं और आपको पूरी तस्वीर मिल जाएगी।
सरगस

5
Avdi ने अद्यतन करने के लिए कि कब और बनाम && पर अपना अपडेट अपडेट किया। मूल रूप से 'और' और 'या' का उपयोग नियंत्रण प्रवाह के लिए उनके कम प्रसार के कारण होता है। devblog.avdi.org/2014/08/26/…
एरिक एमएससी

238

व्यावहारिक अंतर बाध्यकारी शक्ति है, जो अजीब व्यवहार को जन्म दे सकता है यदि आप इसके लिए तैयार नहीं हैं:

foo = :foo
bar = nil

a = foo and bar
# => nil
a
# => :foo

a = foo && bar
# => nil
a
# => nil

a = (foo and bar)
# => nil
a
# => nil

(a = foo) && bar
# => nil
a
# => :foo

वही काम करता है ||और or


2
a = foo and bar और (a = foo ) && bar साबित होता है कि andपहले की तुलना में कम है &&
सरगस

मुझे यह नहीं मिलता है: "फू और बार" का क्या मतलब है?
BKSpurgeon

a = foo and barके बराबर है (a = :foo) and nil। चूंकि असाइनमेंट तार्किक रूप से सही मान देता है ( :foo) तब दूसरा भाग मूल्यांकन करता है, जो विफल रहता है, वापस लौटता है nil
tadman

61

रूबी स्टाइल गाइड बेहतर कहते हैं की तुलना में मैं कर सकता:

का उपयोग करें && / || बूलियन अभिव्यक्तियों के लिए, और / या नियंत्रण प्रवाह के लिए। (अंगूठे का नियम: यदि आपको बाहरी कोष्ठक का उपयोग करना है, तो आप गलत ऑपरेटरों का उपयोग कर रहे हैं।)

# boolean expression
if some_condition && some_other_condition
  do_something
end

# control flow
document.saved? or document.save!

53
दरअसल गाइड अब बचने के लिए and/ orपूरी तरह से कहता है , और उनके पास एक बिंदु हो सकता है। अक्सर नियंत्रण प्रवाह में उनका उपयोग अधिक स्पष्ट रूप से if/ unlessऑपरेटरों के साथ लिखा जा सकता है (उदाहरण के लिए document.save! unless document.saved?)
यारिन

@akostadinov के मामले में आप ट्रोल नहीं कर रहे थे: रूबी स्टाइल गाइड रूबी के रचनाकारों द्वारा नहीं लिखा गया है। रूबी को युकीहिरो मात्सुमोतो और अन्य लोगों द्वारा बनाया गया था, जबकि रूबी स्टाइल गाइड मुख्य रूप से बोहिदर बटसोव द्वारा किया गया था ।
एंड्रयू ग्रिम

2
@AndrewGrimm, धन्यवाद, जानना अच्छा है। ट्रोलिंग के लिए क्षमा करें, लेकिन मैं रूबी वास्तविकता के कुछ पहलुओं के साथ ईमानदारी से भ्रमित हूं। एक बात ज़रूर है - हर रूबी परियोजना को कोडबेस को बनाए रखने के लिए सख्त शैली की नीतियों की आवश्यकता होती है।
अकोस्टैडिनोव

37

||और &&आप प्रोग्रामिंग भाषाओं में बूलियन ऑपरेटरों से जो अपेक्षा करते हैं, उसके साथ बाँधें ( &&बहुत मजबूत है, ||थोड़ा कम मजबूत है)।

andऔर orकम पूर्वता है।

उदाहरण के लिए, इसके विपरीत ||, orइसकी निम्न पूर्वता है =:

> a = false || true
 => true 
> a
 => true 
> a = false or true
 => true 
> a
 => false

इसी तरह, इसके विपरीत &&, andइसकी पूर्ववर्ती स्थिति भी निम्न है =:

> a = true && false
 => false 
> a
 => false 
> a = true and false
 => false 
> a
 => true 

क्या अधिक है, इसके विपरीत &&और ||, andऔर orसमान पूर्वता के साथ बाँधते हैं:

> !puts(1) || !puts(2) && !puts(3)
1
 => true
> !puts(1) or !puts(2) and !puts(3)
1
3
 => true 
> !puts(1) or (!puts(2) and !puts(3))
1
 => true

कमजोर-बाध्यकारी andऔर orनियंत्रण-प्रवाह उद्देश्यों के लिए उपयोगी हो सकता है: http://devblog.avdi.org/2010/08/02/use-and-and-or-in-ruby/ देखें ।


2
"इसके विपरीत ||, orपहले की तुलना में कम है =..." अब यह अधिक समझ में आता है, धन्यवाद!
Steph शार्प

18

andकी तुलना में कम पूर्वता है &&

लेकिन एक अनसुना उपयोगकर्ता के लिए, समस्याएँ हो सकती हैं यदि इसका उपयोग अन्य ऑपरेटरों के साथ किया जाता है जिनकी मिसाल बीच में हो, उदाहरण के लिए, असाइनमेंट ऑपरेटर:

def happy?() true; end
def know_it?() true; end

todo = happy? && know_it? ? "Clap your hands" : "Do Nothing"

todo
# => "Clap your hands"

todo = happy? and know_it? ? "Clap your hands" : "Do Nothing"

todo
# => true

1
धन्यवाद, लेकिन "और" से अलग "और" की पूर्वता कैसी है?
BKSpurgeon

2
@BKSpurgeon रूबी में ऑपरेटर पूर्वता की आदेशित सूची के लिए यहाँ देखें ।
थट्टा जूल

5

andइसकी पूर्वता कम होती है, ज्यादातर हम इसे नियंत्रण-प्रवाह संशोधक के रूप में उपयोग करते हैं if:

next if widget = widgets.pop

हो जाता है

widget = widgets.pop and next

के लिए or:

raise "Not ready!" unless ready_to_rock?

हो जाता है

ready_to_rock? or raise "Not ready!"

मैं उपयोग करना पसंद करता हूं , ifलेकिन अधिक समझदार नहीं है, इसलिए मैं सिर्फ उपेक्षा करता हूं और ।andifandor

अधिक जानकारी के लिए " का उपयोग करना" और "और" या "रूबी में " देखें।


0

मुझे नहीं पता कि यह रूबी का इरादा है या अगर यह बग है लेकिन नीचे इस कोड को आज़माएं। यह कोड रूबी संस्करण 2.5.1 पर चलाया गया था और यह एक लिनक्स सिस्टम पर था।

puts 1 > -1 and 257 < 256
# => false

puts 1 > -1 && 257 < 256
# => true

1
@JakubArnold सारकसम कभी भी मददगार नहीं होता है। कभी-कभी उदाहरण हैं।
BobRodes

@BusRodes यह व्यंग्य नहीं था। 7 उत्तर हैं, जिनमें से 6 पहले से ही उदाहरण हैं।
जैकब अर्नोल्ड

1
@JakubArnold मुझे अब भी यह उदाहरण मददगार लगा।
BobRodes

मुझे अजीब परिणाम भी मिल रहे हैं। v1 = सही और गलत p v1 # => app.rb: true, IRB: false v2 = true && false p v2 # => app.rb: false, IRB: false 1> -1 और& 257 <256 #> डालता है app.rb: false, IRB: false
Rich_F
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.