在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
有没有一种方法可以将参数从&呼叫接线员?
是否有方法将参数从&呼叫接线员?
调用(也称为调用或&
(运算符通常用于执行字符串中的内容,当存在长文件路径或名称中有空格的路径时,或者当我们动态构建要执行的字符串时,我们会执行此操作。
现在,在这种情况下,使用GetNewClosure()
会更改一个函数,以返回一个脚本块作为输出类型。必须使用Call
运算符调用该Scriptblock,因此这是Call operator
的有效用法。
回到你的问题,是的,你可以使用Paradishesion控制执行顺序,并将参数传递给一个函数,该函数从调用行返回闭包,如下所示:
& (hello stephen)
然而,这在操作中相当令人困惑,因为闭包保持着自己独立的范围,在十多年的企业自动化项目中,我从未见过它们被使用。沿着这条路走下去可能会更加混乱。
也许一个更简单的方法可能是:
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/
Jeroen Mostert写了这篇评论:
您已经编写了一个函数,该函数接受一个参数,然后使用该参数创建一个闭包。您似乎想要一个返回带参数的闭包的函数,但这与您的第一个示例相同,并且
function hello { { param($n) "Hello $n"} }
会这么做的。你可以调用它作为
& (hello) "world"
另一方面,如果你想有一个函数作为闭包,你可以调用
${function:hello}
会这样做,即
function hello($n) { "Hello $n" };
$doit = ${function:hello};
& $doit "World"