2011-01-10 11 views
60

शुरुआत सवाल माफ कर दो, लेकिन कहते हैं कि मैं एक सरणी है:तर्कों की एक श्रृंखला को देखते हुए, मैं रूबी में किसी विशेष फ़ंक्शन में उन तर्कों को कैसे भेजूं?

a = [1,2,3] 

और कहीं एक समारोह; मान लें कि यह एक उदाहरण समारोह किए जाने पर:

class Ilike 
    def turtles(*args) 
    puts args.inspect 
    end 
end 

मैं कैसे a साथ Ilike.turtles आह्वान करते जैसे मैं (Ilike.new).turtles(1,2,3) बुला रहे थे।

मैं send से परिचित हूं, लेकिन ऐसा लगता है कि यह किसी सरणी को तर्क सूची में अनुवादित नहीं करता है।

जो मैं खोज रहा हूं उसके समानांतर जावास्क्रिप्ट apply है, जो call के समतुल्य है लेकिन सरणी को एक तर्क सूची में परिवर्तित करता है।

उत्तर

113

जैसा कि आप जानते हैं, जब आप किसी विधि को परिभाषित करते हैं, तो आप किसी सरणी में तर्कों की सूची बदलने के लिए * का उपयोग कर सकते हैं। इसी तरह जब आप किसी विधि को कॉल करते हैं तो आप तर्कों की सूची में सरणी को बदलने के लिए * का उपयोग कर सकते हैं। तो आपके उदाहरण में आप बस कर सकते हैं:

Ilike.new.turtles(*a) 
+4

शानदार। आपके उत्कृष्ट उत्तर के आधार पर, मुझे [विकीबुक्स] (http://en.wikibooks.org/wiki/Ruby_Programming/Syntax/Method_Calls#Variable_Length_Argument_List.2C_Asterisk_Operator) में इस तकनीक का अधिक विस्तृत विवरण मिला है। समानांतर नोटेशन दूसरी तरफ जाने के कारण यह वास्तव में पूरी तरह से उचित है। ओह, रूबी वास्तव में। मैंने यह भी देखा है कि आप 'Ilike.new.turtles (1,2,3, * ए) 'का उपयोग कर अजीब' a.unshift' fidgeting के बिना अपने स्वयं के तर्कों को पूर्ववत कर सकते हैं, हालांकि पोस्टपेन्डिंग को ऐसे मैन्युवर की आवश्यकता होती है। रूबी में –

+1

@ स्टेवेनएक्सू 1.9 आप 'पोस्टपेन्डिंग' के लिए भी विभाजित कर सकते हैं। 'एक = [1,2]; ख = [4,5]; पी (0, * ए, 3, * बी, 6) # => "0 \ n1 \ n2 \ n3 \ n4 \ n5 \ n6" ' – Phrogz

+0

शानदार जवाब दिया! – RubyFanatic

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