2009-12-01 9 views
10

मैं एक उदाहरण पर अपने प्रश्न की व्याख्या करूंगा। के सी # में निम्न कोड करते हैं:पावरशेल: कार्यों को पैरामीटर के रूप में पास करने वाले ब्लॉक

void A(Action block) 
{ 
B(() => 
{ 
    Console.WriteLine(2); 
    block(); 
}); 
} 

void B(Action block) 
{ 
Console.WriteLine(1); 
block(); 
} 

void Main() 
{ 
A(() => 
{ 
    Console.WriteLine(3); 
}); 
} 

इस कोड के उत्पादन में है:

1 
2 
3 

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

function A($block) { 
    B { 
     2 
     . $block 
    } 
} 

function B($block) { 
    1 
    . $block 
} 

A { 
    3 
} 

हालांकि, इस कोड कॉल गहराई ओवरफ़्लो का कारण बनता है:

स्क्रिप्ट विफल हुआ du ई गहराई अतिप्रवाह कॉल करने के लिए। कॉल गहराई 1001 पर पहुंच गया और अधिकतम 1000.

मैंने पाया है कि अगर मैं समारोह बी के पैरामीटर का नाम बदलने के लिए, यह काम करेगा।

क्या यह एक सुविधा या बग (या दोनों) है? मैं PowerShell में उस कार्य को अद्वितीय कार्यों के बिना अनूठे पैरामीटर के बिना कैसे कर सकता हूं?

उत्तर

15

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

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

function A($block) 
{  
    B {Write-Host 2; &$block}.GetNewClosure() 
} 

function B($block) 
{ 
    Write-Host 1 
    &$block 
} 

A {Write-Host 3} 
+0

Thx। ब्लॉक से बंद करने के लिए कोई मानक शॉर्टकट है (उदा। $ {})? –

+0

नहीं। GetNewClosure() विधि एकमात्र तरीका है जिसके बारे में मुझे पता है। –

+0

कीथ हिल आप मेरे नायक हैं! – bwerks

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