PowerShell クロージャーは関数の定義をキャプチャしていないようです。
PS C:\> function x() { Write-Host 'original x' }
PS C:\> function x-caller-generator() { return { Write-host 'Calling x!'; x }.GetNewClosure() }
PS C:\> $y = x-caller-generator
PS C:\> & $y
Calling x!
original x
PS C:\> function x() { Write-Host 'new x' }
PS C:\> & $y
Calling x!
new x
関数の定義をキャプチャする方法はありますか?
私が実際に経験しているのは、クロージャーを作成することですが、クロージャーが実行されると、関数は何らかの形で範囲外になります。(ビルド スクリプト用のpsakeモジュールが行っているのは奇妙なことです。) 次のようなものです。
PS C:\> function closure-maker () {
>> function x() { Write-Host 'x!' }
>>
>> return { Write-host 'Calling x'; x }.GetNewClosure()
>> }
>>
PS C:\> $y = closure-maker
PS C:\> & $y
Calling x
The term 'x' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again.
At line:3 char:39
+ return { Write-host 'Calling x'; x <<<< }.GetNewClosure()
+ CategoryInfo : ObjectNotFound: (x:String) [], CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException
注: PowerShell 2.0 を使用していますが、何か新しいことがあれば 3.0 の回答に興味があります。