我将在一个例子中解释我的问题。我们在C#中有以下代码:
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
}
但是,此代码会导致调用深度溢出:
由于调用深度,脚本失败 溢出。通话深度达到1001 最大值是1000。
我发现如果我更改了函数B的参数名称,它就会起作用。
是功能还是错误(或两者兼而有之)?如何在PowerShell中完成这项工作,而不需要在函数中使用唯一的参数?
答案 0 :(得分:15)
是的,你要递归,因为传递到函数B的scriptblock中的$block
引用在函数B的上下文中被计算,因此,计算B的$block
参数的值。
如果您不想更改参数名称(不要怪你),可以强制PowerShell在A中创建一个新的闭包,以捕获函数A中$ block的值,例如:
function A($block)
{
B {Write-Host 2; &$block}.GetNewClosure()
}
function B($block)
{
Write-Host 1
&$block
}
A {Write-Host 3}