2011-03-06 11 views
35

ग्रोवी में inject विधि वास्तव में क्या करती है? मैंने इसे गुगल किया, और सही जवाब नहीं मिला। क्या कोई इसका उपयोग एक साधारण उदाहरण के साथ निर्दिष्ट कर सकता है?ग्रोवी में इंजेक्ट विधि क्या है?

उत्तर

58

यह एक संग्रह पर एक ऑपरेशन लागू करता है और एक मध्यवर्ती मूल्य का ट्रैक रखता है। यह उदाहरण लें: [1, 2, 3, 4].inject(0, { sum, value -> sum + value })। यह प्रारंभिक मान के रूप में 0 का उपयोग करता है और मध्यवर्ती परिणाम और अनुक्रम में प्रत्येक तत्व को अतिरिक्त ऑपरेशन लागू करता है। ऑपरेशन के प्रत्येक आवेदन में एक नया मध्यवर्ती परिणाम उत्पन्न होता है। इस मामले में, बंद करने से संख्याएं बढ़ जाती हैं, इसलिए यह सूची का योग उत्पन्न करती है। आप इसे पसंद कल्पना कर सकते हैं:

<initial value> <operation> <element1> <operation> ... <elementn> 

या, [1, 2, 3, 4].inject(0, { sum, value -> sum + value }) के मामले में:

0 + 1 + 2 + 3 + 4 

एक सूची के उत्पाद को खोजने के लिए, आपको [1, 2, 3, 4].inject(1, { product, value -> product * value}) उपयोग कर सकते हैं। इस मामले में, 1 प्रारंभिक मान के रूप में उपयोग किया जाता है, क्योंकि यह mulitplication के लिए पहचान मान है।

यहाँ एक उदाहरण है कि शब्दों का एक फ्लैट सूची में बहु-शब्द स्ट्रिंग की एक सूची विभाजन है:,

strings = ["", "this", "is a", "test of inject!"] 
words = strings.inject([], { list, value -> list + value.tokenize() }) 
assert words == ["this", "is", "a", "test", "of", "inject!"] 

अन्य नियम है कि कभी कभी यह कार्रवाई कर रहे हैं "को कम करने" का वर्णन किया जाता, MapReduce में के रूप में या एक "गुना" (विशेष रूप से foldl)।

+0

क्या आप उदाहरण में कह सकते हैं, टोकननाइजेशन क्या करता है? –

+0

टोकनिज सिर्फ व्हाइटस्पेस पर एक स्ट्रिंग को विभाजित करता है। यह String.split जैसा ही है, सिवाय इसके कि यह एक सरणी के बजाय एक सूची देता है। – ataylor

+3

विधि नाम की एक बहुत ही अजीब पसंद - मुझे आश्चर्य है कि इसका नाम कम या फोल्ड क्यों नहीं किया गया था? –

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