2012-12-10 12 views
5

में नाम से एक फ़ंक्शन पास करें आप रुबी में नाम से फ़ंक्शन कैसे पास कर सकते हैं? (मैं केवल कुछ घंटों के लिए रूबी का उपयोग कर दिया गया है, तो मैं अभी भी बातें पता लगाना कर रहा हूँ।)रुबी

nums = [1, 2, 3, 4] 

# This works, but is more verbose than I'd like  
nums.each do |i| 
    puts i 
end 

# In JS, I could just do something like: 
# nums.forEach(console.log) 

# In F#, it would be something like: 
# List.iter nums (printf "%A") 

# In Ruby, I wish I could do something like: 
nums.each puts 

यह रूबी में इसी तरह संक्षेप किया जा सकता है? क्या मैं सिर्फ ब्लॉक का उपयोग करने के बजाय नाम से फ़ंक्शन का संदर्भ दे सकता हूं?

लोग मतदान करने के लिए मतदान करते हैं: क्या आप समझा सकते हैं कि यह वास्तविक प्रश्न क्यों नहीं है?

+1

क्या आप यही देख रहे हैं? http://stackoverflow.com/questions/522720/passing-a-method-as-a-parameter-in-ruby –

उत्तर

6

आप निम्न कर सकते हैं:

nums = [1, 2, 3, 4] 
nums.each(&method(:puts)) 

This article procs, ब्लॉक, और रूबी के lambdas के बीच मतभेद की एक अच्छी व्याख्या है।

+0

यह अच्छा है। विश्वास नहीं कर सकता मैंने कभी और विधि() 'नहीं देखा है! –

+0

एक उदाहरण विधि निर्दिष्ट करना भी संभव है, उदा। 'Nums.each (& $ stderr.method (: डालता है))' –

3

क्या मैं सिर्फ ब्लॉक में इसे लपेटने के बजाय नाम से फ़ंक्शन का संदर्भ दे सकता हूं?

आप इसे 'रैपिंग' नहीं कर रहे हैं - ब्लॉक फ़ंक्शन फ़ंक्शन है।

बजाय कोष्ठक हैं संक्षिप्तता एक चिंता का विषय है, तो आप उपयोग कर सकते हैं do..end:

nums.each {|i| puts i} 
0

नहीं बाहर के बॉक्स, यद्यपि आप method उपयोग कर सकते हैं:

def invoke(enum, meth) 
    enum.each { |e| method(meth).call(e) } 
end 

मैं इसे पसंद करते हैं एक बंदरगाह Enumerable में लपेटा।

इसके बारे में भी जाने के अन्य तरीके हैं; यह दयालु बल है।