4

工作,我不能让这个例子的工作试图让高阶函数在PowerShell中

{ $_ + $_ }, { $_ + 1}, {$_ - 1} | % { $_ 1 } 

我希望它构建一个列表/阵列/收藏/任何的功能(这部分是罚款) ,然后将该列表传递给右侧的代码块,该代码块将每个函数应用于参数1,并返回一个包含结果(即2,2,0)的数组。我尝试过使用getnewclosure()方法,&运算符,到目前为止没有任何工作。

回答

6

美元下划线变量是自动变量只在某些情况下填充;在这种情况下,当存在来自管道的传入对象时。为了让$_的值为1,这看起来是您的意图,您必须将数字传递给每个值,并执行脚本块。要做到这一点,最简单的方法是直接把它作为参数传递给%foreach-object),它接受一个脚本块:

PS> { $_ + $_ }, { $_ + 1}, {$_ - 1} | % { 1 | % $_ } 
2 
2 
0 

看着它,直到它是有道理的:)如果不点击,评论回到这里我会更详细地解释。

如果你有兴趣在PowerShell中的功能修修补补,你可能会喜欢这个功能,我写了部分应用程序:

http://www.nivot.org/blog/post/2010/03/11/PowerShell20PartialApplicationOfFunctionsAndCmdlets

这是一个有点笨拙,但还是可以的。

3

我想建议稍微不同的方法:使用代替$_另一个自动变量,以便使用传递的值(1):& { $_ } 1情形:

{ $args[0] + $args[0] }, { $args[0] + 1 }, { $args[0] - 1 } | % { & $_ 1 } 

如[287]莪提到的,$_不使用,它只在涉及管道时才起作用。

+0

哦,我认为$ _始终限定在当前块中。这样做实际上有所作为。哈哈不错 – TheIronKnuckle

+3

我考虑过这个,但我认为使用'$ _'确实很贴心。如果你打算去'$ args [0]'路线,那么使用明确的'param($ x)'可能会更清晰。 – x0n