Tuesday 15 January 2013

c# - PowerShell: passing blocks as parameters to functions -


मैं एक उदाहरण पर अपने प्रश्न की व्याख्या करेगा। चलो C #:

  शून्य ए (एक्शन ब्लॉक) में निम्नलिखित कोड है {B (() = & gt; {Console.WriteLine (2); block ();}); } शून्य बी (एक्शन ब्लॉक) {कंसोल। WrightLine (1); ब्लॉक (); } शून्य मुख्य () {ए (() = & gt; {Console.WriteLine (3);}); }  

इस कोड का आउटपुट है:

  1 2 3  

अब, मैं यह लिखना चाहता हूं कोड PowerShell में:

  फ़ंक्शन ए ($ ब्लॉक) {B {2। $ ब्लॉक}} फ़ंक्शन बी ($ ब्लॉक) {1 $ Block} A {3}  

हालांकि, यह कोड कॉल की गहराई अतिप्रवाह करता है:

कॉल की गहराई अतिप्रवाह के कारण स्क्रिप्ट विफल रहा। कॉल की गहराई 1001 तक पहुंच गई और अधिकतम 1000 है।

मैंने पाया है कि अगर मैं फ़ंक्शन बी के पैरामीटर का नाम बदलता हूँ, तो यह काम करेगा।

है यह एक फीचर या बग (या दोनों)? मैं पार्सशेल में यह काम कैसे कर सकता हूँ बिना फ़ंक्शंस में विशिष्ट पैरामीटर के बिना?

हाँ, आप जा रहे हैं पुनरावर्ती क्योंकि फ़ंक्शन बी में दिए गए स्क्रिप्टब्लॉक में $ block संदर्भ फ़ंक्शन बी के संदर्भ में मूल्यांकन किया जाता है और परिणामस्वरूप, बी के $ block पैरामीटर के मूल्य का मूल्यांकन करता है

यदि आप पैरामीटर नाम बदलना नहीं चाहते हैं (आप पर दोष नहीं डालें) तो आप PowerShell को ए में एक $ $ ब्लॉक के मूल्य को कैप्चर करने के लिए ए में एक नया क्लॉथर बनाने के लिए बाध्य कर सकते हैं जैसे:

  फ़ंक्शन ए ($ ब्लॉक) {B} लिखें-होस्ट 2; & Amp; $ ब्लॉक} .GetNewClosure ()} फ़ंक्शन बी ($ ब्लॉक) {लिखें-होस्ट 1 और $ ब्लॉक} ए {लिखें-होस्ट 3}  

No comments:

Post a Comment