2008-11-28 14 views
11

मैं उपज में एक तर्क संख्या के तर्क कैसे पारित कर सकता हूं। मैं एक सरणी पास नहीं करना चाहता (जैसा कि निम्न कोड करता है), मैं वास्तव में उन्हें ब्लॉक में तर्कों की प्रोग्रामेटिक संख्या के रूप में पास करना चाहता हूं।रुबी में उपज करने के लिए मैं प्रोग्रामेटिक रूप से तर्क कैसे पारित कर सकता हूं?

def each_with_attributes(attributes, &block) 
    results[:matches].each_with_index do |match, index| 
    yield self[index], attributes.collect { |attribute| (match[:attributes][attribute] || match[:attributes]["@#{attribute}"]) } 
    end 
end 

उत्तर

13

तर्क में सरणी चालू करने के लिए सूचक ऑपरेटर * का प्रयोग करें।

block.call(*array) 

या

yield *array 
2

तारांकन माणिक में अलग-अलग तर्कों को एक सरणी का विस्तार होगा:

def test(a, b) 
    puts "#{a} + #{b} = #{a + b}" 
end 

args = [1, 2] 

test *args 
3

एक तर्क सूची में अपनी अलग-अलग घटकों में एक सरणी का विस्तार करने के तारांकन का उपयोग करें:

def print_num_args(*a) 
    puts a.size 
end 

array = [1, 2, 3] 
print_num_args(array); 
print_num_args(*array); 

प्रिंट होगा:

1 
3 

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

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

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