एक विधि से दो और अधिक मान लौटाएं


105

क्या विधि से कई मान वापस करने की कोई संभावना है? कुछ इस तरह:

def someMethod()
  return ["a", 10, SomeObject.new]
end

[a, b, c] = someMethod

जवाबों:


160
def sumdiff(x, y)
  return x+y, x-y
end
#=> nil

sumdiff(3, 4)
#=> [7, -1]

a = sumdiff(3,4)
#=> [7, -1]
a
#=> [7, -1]

a,b=sumdiff(3,4)
#=> [7, -1]
a
#=> 7
b
#=> -1

a,b,c=sumdiff(3,4)
#=> [7, -1]
a
#=> 7
b
#=> -1
c
#=> nil

आपको कोड स्वरूपण का उपयोग करना चाहिए, पाठ स्वरूपण का नहीं। इंडेंट लाइन्स चार स्पेस और irb के >>प्रॉम्प्ट के कारण होने वाली अजीबता दूर हो जाएगी।
क्रिस लुत्ज़

4
चूंकि एक स्पष्ट रिटर्न को गैर-मुहावरेदार रूबी माना जाता है, आप स्पष्ट रूप से रिटर्न मान को एक सूची में डालकर एक अंतर्निहित रिटर्न का उपयोग कर सकते हैं:def foo_and_bar; ['foo', 'bar']; end
डेनिस

43

रूबी में विनाशकारी बाँध का एक सीमित रूप है:

ary = [1, 2, 3, 4]
a, b, c = ary
p a # => 1
p b # => 2
p c # => 3

a, b, *c = ary
p c # => [3, 4]

a, b, c, d, e = ary
p d # => 4
p e # => nil

इसका एक सीमित रूप बाँध संरचना भी है:

 a = 1, 2, 3
 p a # => [1, 2, 3]

आप उन दो रूपों को जोड़ सकते हैं जैसे:

a, b = b, a # Nice way to swap two variables

a, b = 1, 2, 3
p b # => 2

def foo; return 1, 2 end
a, b = foo
p a # => 1
p b # => 2

कई अन्य चीजें हैं जो आप विनाशकारी / संरचना बांधने के साथ कर सकते हैं। मैं दिखावा ऑपरेटर का उपयोग नहीं दिखा (* दाहिने हाथ की तरफ ) । मैंने घोंसले के शिकार (parantheses का उपयोग करके) नहीं दिखाया। मैंने नहीं दिखाया कि आप किसी ब्लॉक या विधि के पैरामीटर सूची में विनाशकारी बाँध का उपयोग कर सकते हैं।

यहाँ सिर्फ एक क्षुधावर्धक है:

def foo(((a, b, c, d), e, *f), g, *h)
  local_variables.sort.each do |lvar| puts "#{lvar} => #{eval(lvar).inspect}" end
end

foo([[1, 2, 3], 4, 5, 6], 7, 8, 9)
# a => 1
# b => 2
# c => 3
# d => nil
# e => 4
# f => [5, 6]
# g => 7
# h => [8, 9]

16

कई मूल्यों को वापस करते हुए अक्सर उपयोगी होता है, मुझे आमतौर पर यह एक नई वस्तु की आवश्यकता के लिए एक संकेतक है।

यही है, मैं आमतौर पर पाता हूं कि उन रिटर्न मानों को अर्थ / संदर्भ में एक साथ जोड़ा जाता है और इस तरह से पास किया जाता है। इसलिए इन मामलों में मैं इन्हें एक साथ जोड़ने के लिए एक नई वस्तु बनाऊंगा। यह एक विशेष कोड गंध है जिसे मैंने पहचानना सीखा है।


4
अधिक स्वतंत्रता, अधिक जिम्मेदारी। अनुभवी माणिक इसका फायदा उठाते और कुछ सुंदर कोड लिखते। जबकि रूबी रोकी चीजें बदतर बना सकती हैं।
17

1
अच्छी तरह से स्पष्ट रूप से हमेशा ऐसा नहीं होता है, या जैसी चीजें chunkमौजूद नहीं होंगी। उत्कृष्ट सिद्धांत हालांकि। कोड गंध वास्तव में। रॉक ऑन।
डार्थ एलीजियस

6

आप यह रिटर्निंग एक सरणी भी प्राप्त कर सकते हैं, जैसे

def sumdiff(x, y)
    [x+y, x-y]
end

जो कार्यात्मक रूप से इसके बराबर लगता है

def sumdiff(x, y)
    return x+y, x-y
end
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.