2012-12-19 11 views
36

संभव डुप्लिकेट पारित करने के लिए:
Shorter way to pass every element of an array to a functionकैसे एक समारोह के बजाय एक ब्लॉक की

मैं जानता हूँ कि यह काम करेगा:

def inc(a) 
    a+1 
end 
[1,2,3].map{|a| inc a} 

लेकिन अजगर में, मैं सिर्फ जरूरत है लिखने के लिए:

map(inc, [1,2,3]) 

या

[inc(x) for x in [1,2,3]) 

मैं सोच रहा था कि क्या मैं रूबी में एक ब्लॉक बनाने के कदम को छोड़ सकते हैं, और ऐसा किया:

[1,2,3].map inc 
# => ArgumentError: wrong number of arguments (0 for 1) 
# from (irb):19:in `inc' 

किसी को भी ऐसा करने के तरीके के बारे में विचार है?

+0

है http://stackoverflow.com/questions/13834846/shorter-way-to-pass- प्रत्येक-तत्व-ऑफ-ए-एरे-टू-ए-फ़ंक्शन/13834860 ​​# 13834860 ​​ – oldergod

उत्तर

57

"Passing Methods like Blocks in Ruby" के अनुसार, यदि आप एक विधि एक ब्लॉक के रूप में इतनी तरह पारित कर सकते हैं:

p [1,2,3].map(&method(:inc)) 

है कि अगर अपने स्वयं के ब्लॉक रोलिंग की तुलना में काफी बेहतर है पता है, ईमानदारी से करें।

अपने विधि वस्तुओं का उपयोग कर रहे के वर्ग पर परिभाषित किया गया है, तो आप ऐसा कर सकते हैं:

# Adding inc to the Integer class in order to relate to the original post. 
class Integer 
    def inc 
    self + 1 
    end 
end 

p [1,2,3].map(&:inc) 

उस मामले में, रूबी एक उदाहरण विधि नाम के रूप में प्रतीक की व्याख्या और फोन करने का प्रयास करेंगे उस वस्तु पर विधि।


कारण आप अजगर में एक प्रथम श्रेणी वस्तु के रूप में एक समारोह के नाम पारित कर सकते हैं, लेकिन रूबी में नहीं है, क्योंकि रूबी आप कोष्ठकों के बिना शून्य तर्क के साथ एक विधि कॉल करने की अनुमति देता है। पायथन का व्याकरण, क्योंकि इसे कोष्ठक की आवश्यकता होती है, फ़ंक्शन नाम में गुजरने और किसी भी तर्क के साथ फ़ंक्शन को कॉल करने के बीच किसी भी संभावित अस्पष्टता को रोकता है।

+0

मुझे लगता है कि हम एक और कारण नहीं लिख सकते हैं कि हम 'नक्शा (: inc)' सीधे लिख सकते हैं रूबी एक शुद्ध ओओ भाषा है। – halfelf

+0

एएके, 'और' टोकन भूल गया, क्षमा करें। फिक्स्ड। –

+3

'रुबी प्रतीक के नाम के रूप में प्रतीक की व्याख्या करेगा और उस ऑब्जेक्ट पर विधि को कॉल करने का प्रयास करेगा।' => उदाहरण विधि का आपका उल्लेख सही नहीं है, या कम से कम पर्याप्त स्पष्ट नहीं है। 'और' यह एक ब्लॉक में जो जुड़ा हुआ है उसे परिवर्तित करता है यदि यह एक प्रक्रिया है। यदि यह प्रो नहीं है, तो यह इस मामले में 'प्रतीक # to_proc'', 'to_proc' लागू होता है। – sawa

9

आपके प्रश्न का उत्तर नहीं है, लेकिन अगर आप वास्तव में सिर्फ अपने सभी चर बढ़ाने के लिए चाहते हैं, आप Integer#next

4.next 
#=> 5 

[1,2,3].map(&:next) 
#=> [2, 3, 4] 
संबंधित मुद्दे