2010-12-29 10 views
10

मैं एक विधि है कि सूचक ऑपरेटर को स्वीकार करता है:एक विधि कॉल करने के लिए तर्क के रूप में एक सरणी के तत्वों भेजा जा रहा है

def hello(foo, *bar) 
    #... do some stuff 
end 

मैं एक चर लंबाई है कि मैं इस हैलो विधि में भेजना चाहते हैं के साथ एक सरणी है :

arr1 = ['baz', 'stuff'] 
arr2 = ['ding', 'dong', 'dang'] 

मुझे लगता है कि विधि के लिए तर्कों के रूप arr1 और arr2 साथ विधि कॉल करने के लिए करना चाहते हैं, लेकिन मुझे लगता है कि * पट्टी में लटका दिया व्यक्ति तर्क के बजाय एक सरणी के रूप में व्याख्या की जा रही है हो रही रखने के लिए। चीजों को और मजेदार बनाने के लिए, मैं हैलो विधि को बिल्कुल भी नहीं बदल सकता।

मैं this SO question के समान कुछ ढूंढ रहा हूं लेकिन रूबी में।

+1

कुछ और कोड बहुत उपयोगी होंगे। –

+0

सबसे उपयोगी उत्तर के बाईं ओर खोखले चेकमार्क के अंदर क्लिक करके अपने प्रश्नों के सही उत्तर स्वीकार करें। धन्यवाद! :) –

उत्तर

11

इस

hello(arr1, *arr2) 

है जैसे कि यह बुला की कोशिश यहाँ दूसरी सरणी के लिए * जोड़कर आईआरबी

irb(main):002:0> def hello(foo, *bar) 
irb(main):003:1> puts foo.inspect 
irb(main):004:1> puts bar.inspect 
irb(main):005:1> end 
=> nil 
irb(main):006:0> arr1 = ['baz', 'stuff'] 
=> ["baz", "stuff"] 
irb(main):007:0> arr2 = ['ding', 'dong', 'dang'] 
=> ["ding", "dong", "dang"] 
irb(main):008:0> hello(arr1, arr2) 
["baz", "stuff"] 
[["ding", "dong", "dang"]] 
=> nil 
irb(main):009:0> hello(arr1, *arr2) 
["baz", "stuff"] 
["ding", "dong", "dang"] 
=> nil 

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

+0

धन्यवाद, यह वही है जो हो रहा था। यहां तक ​​कि जब मैंने पास किए गए तर्कों पर 'bar.class' कहा था, तब भी मैं सरणी देख रहा था। मुझे नहीं लगता था कि यह एक सरणी का सरणी हो सकता है। – brycemcd

8

यहां आप जाएं:

hello('Something', *(arr1 + arr2)) 

यह arr1 और arr2 सरणियों गठबंधन और सामूहिक रूप से विधि के लिए पर दूसरा तर्क से उन्हें पारित करेंगे।

उदाहरण:

>> def hello(str, *args) 
>> puts str 
>> args.each do |arg| 
?> puts 'Splat: ' + arg 
>> end 
>> end 
=> nil 
>> hello('Hello', *(['programming'] + ['is', 'fun'])) 
Hello 
Splat: programming 
Splat: is 
Splat: fun 
=> ["programming", "is", "fun"] 

एक विधि के अंतिम पैरामीटर तारांकित (*) से पहले किया जा सकता है, यह इंगित करता है कि अधिक मापदंडों समारोह के लिए पारित किया जा सकता है। उन पैरामीटर एकत्र किए जाते हैं और एक सरणी बनाई जाती है।

चूंकि अंतिम पैरामीटर एक सरणी में एकत्र किए जाते हैं, इसलिए आपको * ऑपरेटर का उपयोग करने के लिए यह इंगित करने की आवश्यकता है कि आप वास्तव में विधि में एक सरणी भेज रहे हैं और यह तर्क किसी अन्य सरणी में लपेटना नहीं चाहिए।

+0

किसी भी कारण से आप वास्तविक कोड के बजाय स्क्रीनशॉट चिपकाना पसंद करते हैं? –

+0

@Mladen Jablanovic कोई कारण नहीं, वास्तव में यदि आप पसंद करते हैं तो मैं कोड में पेस्ट करूंगा। –

+3

धन्यवाद। मुझे लगता है कि यह सिर्फ समय की बात है जब कोई वास्तव में कोड प्रिंट करेगा, मुद्रित पेपर को स्कैन करेगा और इसे एक छवि के रूप में संलग्न करेगा। :) –

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