पर्ल डिफ़ॉल्ट मानों के बारे में बहुत अच्छा है:
: jmglov @ laurana; Perl -e'foo; Printf "% d \ n", $ foo [123] '0: jmglov @ लौराना; Perl -e '% foo; प्रिंटिफ़ "% d \ n", $ foo {bar} '0 रूबी कम से कम हैश के लिए भी ऐसा कर सकता है:
& gt; & gt; ; Foo = हैश.न्यू (0) = & gt; {} & Gt; & gt; Foo [: bar] = & gt; 0 लेकिन ऐसा प्रतीत होता है कि एरे के लिए काम नहीं करता है:
& gt; & gt; Foo = सरणी.न्यू (0) = & gt; [] & Gt; & gt; एफू [123] = & gt; शून्य & gt; & gt; फू [124] = 0 = & gt; 0 & gt; & gt; एफयू [456] = 0 = & gt; 0 & gt; & gt; फू [455,456] = & gt; [शून्य, 0] क्या यह सरणियों के लिए एक डिफ़ॉल्ट मान की आपूर्ति करना संभव है, इसलिए जब वे स्वतः विस्तारित होते हैं, तो शून्य के बजाय 0 से भर रहे हैं? < P> बेशक मैं इस पर काम कर सकता हूँ, लेकिन एक अभिव्यक्ति के लिए लागत पर:
& gt; & gt; फू [457,458] = 890, 321 = & gt; [8 9 0, 321] & gt; & gt; Foo [456] + = 789 नॉन-विधि एन्टर: जब आपके पास यह अपेक्षा नहीं की गई थी, तब आपके पास शून्य वस्तु थी! आप शायद आरे का एक उदाहरण होने की उम्मीद कर रहे थे शून्य का मूल्यांकन करते समय त्रुटि हुई। & Gt; & gt; Foo.inject (0) {| sum, i | राशि + = (आई || 0)} = & gt; 1211 & gt; & gt; Foo.inject (: +) NoMethodError: जब आप यह अपेक्षा नहीं की थी तब आपके पास शून्य वस्तु थी! आप शायद आरे का एक उदाहरण होने की उम्मीद कर रहे थे शून्य का मूल्यांकन करते समय त्रुटि हुई। + अपडेट 1: मेरे एक सहयोगी ने बताया कि मैं हल करने के लिए #compact का उपयोग कर सकता हूं मानक तत्व- at-index समस्या को हल करने के लिए #inject मुद्दा, और #to_i : & gt; & gt; foo.include? शून्य = & gt; सच & gt; & gt; Foo.compact.inject (: +) = & gt; 1211 & gt; & gt; फू [456,457] = & gt; [0, 8 9 0, 321] & gt; & gt; फू [455..457] = & gt; [शून्य, 0, 8 9] & gt; & gt; एफयू [455..457] .मैप (और: टू_आई) = & gt; [0, 0, 890] अपडेट 2: + = समस्या के समाधान के लिए धन्यवाद: & gt; & gt; Foo = [] = & gt; [] & Gt; & gt; डेफ एफू। [] (आई) & gt; & gt; फ़ेच (i) {0}> & gt; & gt; अंत = & gt; शून्य & gt; & gt; एफू [4] = & gt; 0 & gt; & gt; Foo = & gt; [] & Gt; & gt; फू [4] + = 123 = & gt; 123 & gt; & gt; Foo = & gt; [शून्य, शून्य, शून्य, शून्य, 123] अपडेट 3: यह अजीब-एक-तिल की तरह दिखना शुरू कर रहा है! <कोड> & gt; & gt; Foo = & gt; [शून्य, शून्य, शून्य, शून्य, 123] & gt; & gt; Foo [-2 ..-1] प्रकार त्रुटि: श्रेणी में पूर्णांक में परिवर्तित नहीं किया जा सकता लेकिन हम उस से निपट सकते हैं:
& gt; & gt; डीफ एफू। [] (इंडेक्स) & gt; & gt; यदि index.is_a? श्रेणी & gt; & gt; Index.map {| i | स्व [i]} & gt; & gt; अन्य? & Gt; फ़ेच (इंडेक्स) {0} # डिफ़ॉल्ट से 0 यदि कोई तत्व इंडेक्स पर नहीं है; सरणी के ऑटो-एक्सटेंशन का कारण नहीं होगा & gt; & gt; अंत & gt; & gt; अंत = & gt; शून्य & gt; & gt; Foo = & gt; [शून्य, शून्य, शून्य, शून्य, 123] & gt; & gt; Foo [-2 ..-1] = & gt; [शून्य, 123] अब मुझे (भेड़-बोर) को स्वीकार करना होगा कि मैं अपने कोड को अव्यवस्था से बचने के लिए सरणी उप-वर्ग दूँगा: कक्षा MyClass वर्ग ArrayWithDefault & lt; सरणी डीईएफ़ [] (सूचकांक) यदि index.is_a? रेंज index.map {| i | स्वयं [i]} और फ़ेच (इंडेक्स) {0} # डिफ़ॉल्ट से 0 अगर कोई तत्व इंडेक्स पर नहीं है; ऐरे अंत अंत एंड एंड के ऑटो एक्सटेंशन का कारण नहीं होगा सभी रचनात्मक समाधानों के लिए धन्यवाद वास्तव में टिमटोवटी!
यह देखते हुए कि रूबी रिटर्न शून्य एक गैर-मौजूदा तत्व के लिए (इंडेक्स-आउट-ऑफ-बाउंड टाइप प्रकार के विपरीत), आप बस "या" का उपयोग कर सकते हैं: a = [1,2,3] एक डालता है [5] # = & gt; निल एक डालता है [5] || "एक डिफ़ॉल्ट" # = & gt; एक डिफ़ॉल्ट आप बंदर पैच दृष्टिकोण ले सकते हैं, लेकिन संभवतः आप इसे 1-फ़ाइल स्क्रिप्ट से कुछ भी बड़ा नहीं करना चाहते हैं:
ए = [1,2,3] डीईएफ़ ए। [] (इंडेक्स) सेल्फ.ैट (इंडेक्स) || "एक डिफ़ॉल्ट" अंत एक डालता है [5] # = & gt; "एक डिफ़ॉल्ट"
Comments
Post a Comment