Saturday 15 May 2010

What determines whether the Powershell pipeline will unroll a collection? -


  # सरणी सी: \ & gt; (1,2,3)। गणना 3 सी: \ & gt; (1,2,3 | उपाय) .काउंट 3 # हैशटेबल सी: \ & gt; @ {1 = 1; 2 = 2; 3 = 3}। गणना 3 सी: \ & gt; (@ {1 = 1; 2 = 2; 3 = 3} | माप)। संख्या 1 # फ़ंक्शन C: \ & gt; फ़ंक्शन असोलमे {$ args} सी: \ & gt; (UnrollMe a, b, c)। संख्या 3 सी: \ & gt; (UnrollMe a, b, c | उपाय)। गणना 1 सी: \ & gt; (1,2,3) .gettype () -ईसी (UnrollMe a, b, c) .gettype () सच है  

हैशटेबल के साथ विसंगति है, हालांकि केवल इसका आंशिक रूप से उल्लेख है ( उदाहरण के द्वारा)।

फ़ंक्शन के साथ समस्या, हालांकि, मेरे लिए समाचार है मुझे आश्चर्य है कि इससे पहले मुझे अब तक काटा नहीं गया है। क्या कुछ मार्गदर्शक सिद्धांत हैं जो हम पटकथाओं का अनुसरण कर सकते हैं? मुझे पता है कि सी # में सीएमडीलेट लिखते समय एक ऐसा स्थान होता है जहां आप स्पष्ट रूप से संख्या को नियंत्रित कर सकते हैं, लेकिन एएएआईआईआई ने पॉश भाषा में ऐसा कोई निर्माण नहीं किया है। अंतिम उदाहरण बताता है कि, पोश दुभाषिया का मानना ​​है कि वस्तुओं के प्रकार में पाइप होने में कोई अंतर नहीं है। मुझे संदेह है कि कुछ ऑब्जेक्ट बनाम PSObject weirdness हुड के तहत हो सकता है, लेकिन जब आप शुद्ध पोश लिख रहे हैं और स्क्रिप्ट भाषा को "बस काम" की अपेक्षा करते हैं तो इसका थोड़ा उपयोग होता है।

/ संपादन /

कीथ इंगित करने के लिए सही है कि मेरे उदाहरण में, मैं 3 स्ट्रिंग तर्कों के बजाय एक स्ट्रिंग [] तर्क में गुजर रहा हूं। दूसरे शब्दों में, माप-ऑब्जेक्ट का कारण यह है कि गणना = 1 कहती है क्योंकि यह एक सरणी-के- arrays देख रहा है जिसका पहला तत्व @ ("a", "b", "c") है। काफी उचित। यह ज्ञान आपको कई तरह से इस मुद्दे के आसपास काम करने की अनुमति देता है:

  एकल वस्तुओं को छड़ी सी: \ & gt; (UnrollMe ए बी सी | मापन)। संख्या 3 # नेस्टिंग सी को संभालने के लिए फ़ंक्शन को फिर से लिखना: \ & gt; फ़ंक्शन UnrollMe2 {$ args [0]} सी: \ & gt; (UnrollMe2 a, b, c | उपाय)। संख्या 3 # स्थिति सी: \ & gt; फ़ंक्शन UnrollMe3 {$ आर्ग्स | % {$ _}} सी: \ & gt; (UnrollMe3 a, b, c | measure) .count 3  

हालांकि, यह सब कुछ समझा नहीं है ...

  # जैसा पहले देखा गया - अगर हम वास्तव में @ (@ ("a", "b", "c") लौट रहे हैं) क्यों नहीं गिनती = 1? C: \ & gt; (UnrollMe a, b, c)। संख्या 3 # हमारे सिद्धांत को इन परिणामों की व्याख्या भी करनी होगी: C: \ & gt; ((UnrollMe a, b, c) | उपाय)। गणना 3 सी: \ & gt; (@ (@ ("ए", "बी", "सी") | उपाय)। गणना 3 सी: \ & gt; ((UnrollMe a, b, cd) | measure)। Count 2  

मैं खेल में एक और नियम का एक्सट्रपलेशन कर सकता हूं: यदि आपके पास एक तत्व है और पार्सर है में, तो दुभाषिया "खोलना" तत्व कहा जाएगा मुझे कोई याद नहीं है?

$ args अनारोल्ड है याद रखें कि फ़ंक्शन पैरामीटर सामान्य रूप से उन्हें अलग करने के लिए अंतरिक्ष का उपयोग कर पास कर रहे हैं। जब आप 1,2,3 पास करते हैं, तो आप एक एकल तर्क में गुजरते हैं जो कि तीन अंकों की एक सरणी होती है जो कि $ args [0]:

  पीएस & gt; फ़ंक्शन असोलमे {$ args} पी एस & gt; UnrollMe 1 2 3 | एक गणना अभिव्यक्ति (या subexpression जैसे  $ () ) के भीतर परिणामों को (एक सरणी) डालने के लिए यह फिर से अनदेखी करने के लिए इसे फिर से पात्र बनाता है: UnrollMe द्वारा लौटे 1,2,3 वस्तु वाले [] को अनारोल्ड करता है: 

  पीएस & gt; ((UnrollMe 1,2,3) | उपाय) .कौरा 3  

जो समतुल्य है:

  पीएस & gt; (1, 2, 3) | माप)। 3 अंक  

बीटीडब्ल्यू यह केवल एक तत्व के साथ सरणी पर लागू नहीं होता।

  पीएस & gt ; ((1,2), 3) | किसी सरणी पर पहले से ही एक सरणी है पर सरणी subexpression ( @ () ) का उपयोग करना {{$ _। GetType}। नाम} वस्तु [] Int32  

कोई प्रभाव नहीं चाहे कितनी बार आप इसे लागू करते हैं :-) यदि आप अनारोल्ड को कोमा ऑपरेटर का उपयोग करना रोकना चाहते हैं, क्योंकि यह हमेशा एक अन्य बाहरी सरणी बना देगा जो अनारोल्ड हो। ध्यान दें कि इस परिदृश्य तुम सच में unrolling को नहीं रोकते हैं में, आप बस एक बाहरी "आवरण" सरणी है कि अपने मूल सरणी, उदा, के बजाय unrolled हो जाता है शुरू करने से unrolling के आसपास काम:।

  पी एस & gt; (, (1,2,3) | उपाय)। अंक 1  

अंत में, जब आप इसे निष्पादित करते हैं:

  पीएस & gt; (UnrollMe ए, बी, सी डी) | आप देख सकते हैं कि UnrollMe दो आइटम (ए, बी, सी) एक सरणी के रूप में और एक स्केलर के रूप में घ देता है। उन दो वस्तुओं को पाइप लाइन को अलग से भेजा जाता है, जिसके परिणामस्वरूप गिनती 2 है। 


No comments:

Post a Comment