gpt4 book ai didi

c# - PowerShell:将 block 作为参数传递给函数

转载 作者:可可西里 更新时间:2023-11-01 09:03:40 27 4
gpt4 key购买 nike

我会用一个例子来解释我的问题。让我们在 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
}

但是,这段代码会导致调用深度溢出:

The script failed due to call depth overflow. The call depth reached 1001 and the maximum is 1000.

我发现,如果我更改函数 B 的参数名称,它会起作用。

它是功能还是错误(或两者兼而有之)?我如何才能在 PowerShell 中实现它,而无需跨函数设置唯一参数?

最佳答案

是的,你要递归,因为传递给函数 B 的脚本 block 中的 $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}

关于c# - PowerShell:将 block 作为参数传递给函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1827561/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com