2009-12-02 13 views
7

Keith Hill ने मुझे बताया कि blocks in PowerShell are not closures और ब्लॉक से बंद करने के लिए मुझे विधि .GetNewClosure() पर कॉल करना होगा।पावरशेल: बंद करने के लिए एक शानदार तरीका

क्या ब्लॉक से बंद करने के लिए कोई शानदार तरीका है? (उदाहरण के लिए एक रैपिंग समारोह, एक उपनाम ?, बनाने ...)

उदाहरण:

{ block } 
${ closure } # ??? 

उत्तर

4

आप एक कामकाज बना सकते हैं उस पर एक स्क्रिप्टब्लॉक लेता है, GetNewClosure पर कॉल करता है और बंद कर देता है। यह जरूरी है कि आप डॉट ऑपरेटर उदा .:

function =>([scriptblock]$_sb_) 
{ 
    $_sb_.GetNewClosure() 
} 

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

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

A {Write-Host 3} 

सुनिश्चित नहीं हैं कि यह सिर्फ scriptblock पर GetNewClosure() कॉल हालांकि तुलना में काफी बेहतर है का उपयोग करते हुए इस समारोह कहते हैं। ध्यान दें कि आप फ़ंक्शन के लिए कुछ अन्य नाम चुन सकते हैं। मैं सी # लैम्बदास की तरह कुछ और के लिए जा रहा था।

+0

Thx। फ़ंक्शन को कॉल करने के लिए मुझे डॉट ऑपरेटर का उपयोग करने की आवश्यकता क्यों है? (एक ही संदर्भ प्राप्त करने के लिए?) –

+1

हां, तो फ़ंक्शन उसी स्कोप के भीतर निष्पादित करता है जिसे इसे से कहा जाता है। –

+5

कीथ, हमें वास्तव में एक और प्राकृतिक वाक्यविन्यास के साथ आने में ब्रूस और जेफरी को हरा करने की जरूरत है। मुझे GetNewClosure() विधि से नफरत है। यह बहुत बेकार है। मैं डबल ब्रेसिज़ का उपयोग कर सोच रहा था: {{$ ix}}? – x0n

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

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