0

在 PowerShell 中,如果我使用 param 语法创建闭包,我可以传递参数:

$hello = { param($name) "Hello $name"}
& $hello "World!"

>hello.ps1
Hello World!

当我用函数语法尝试这个时,我遇到了麻烦:

function hello($n) { { "Hello $n" }.GetNewClosure() }

$doit = hello

& $doit "World!"

>functionclosure.ps1
Hello 

我设法通过更早地提供参数来解决这个问题:

function hello($n) { {"Hello $n"}.GetNewClosure()  }

$doit = hello "World"

& $doit

>functionclosure2.ps1
Hello World

有没有办法从 & 调用操作符行将参数传递给函数?

4

2 回答 2

1

有没有办法从 & 调用操作符行将参数传递给函数?

调用(也称为调用或&)运算符通常用于执行字符串中的内容,当文件路径较长或名称中带有空格的路径时,或者当我们动态构建要执行的字符串时,我们会这样做。

现在,在这种情况下,UsingGetNewClosure()改变了一个函数以返回一个脚本块作为输出类型。该 Scriptblock 必须使用Call运算符调用,因此这是Call operator.

回到您的问题,是的,您可以使用括号控制执行顺序并将参数传递给从调用行返回闭包的函数,如下所示:

& (hello stephen)

然而,这在操作上相当令人困惑,因为闭包保持自己独立的范围,并且在十多年的企业自动化项目中,我从未见过它们被使用过。沿着这条路走下去可能比值得更多的困惑。

Prehaps 一个更简单的方法可能是:

function hello($name) { "WithinFunction: Hello $name"}
$do = 'hello "world"'
PS> $do
hello "world"
#invoke
PS> invoke-expression $do
WithinFunction: Hello world

在 PowerShell 中实现闭包的人自己对闭包的补充阅读。 https://devblogs.microsoft.com/scripting/closures-in-powershell/

于 2020-09-25T13:53:27.973 回答
0

Jeroen Mostert 将其写为评论:

您编写了一个函数,该函数接受一个参数,然后使用该参数创建一个闭包。似乎您想要一个返回带有参数的闭包的函数-但这与您的第一个示例相同,并且

function hello { { param($n) "Hello $n"} } 

会这样做。你会调用它作为

& (hello) "world"

另一方面,如果你想要一个函数作为你可以调用的闭包,

${function:hello} 

会这样做,即

function hello($n) { "Hello $n" }; 
$doit = ${function:hello}; 
& $doit "World"
于 2020-09-25T13:45:41.283 回答