简洁地将函数作为参数传递

时间:2015-01-14 04:08:10

标签: powershell higher-order-functions

此函数接受两个值和一个函数,并使用两个值调用该函数:

function abc ($a, $func, $b) { &$func $a $b }

定义要传递的函数:

function bcd ($x, $y) { $x + $y }

bcd传递给abc

abc 10 bcd 20

结果为30

似乎没有传递bcd函数对象本身,而是字符串“bcd”。然后abc按名称调用bcd

这被认为是将函数传递给另一个函数的可接受方式吗?我见过的大多数例子都建议在脚本块中传递一个函数,该函数将在接收函数中调用。然而,这种方法比上述方法更冗长。

2 个答案:

答案 0 :(得分:2)

只要范围没有足够的变化来使命名无效,您就可以纠正它的工作原理。因此,对于真正的通用代码来说,它有点脆弱;例如,我甚至不会在你的个人资料脚本中推荐它。 (从一些痛苦的经历来讲,这里的概况不够通用。)

但是,请考虑这个样本,它更短,更健壮:

function abc($a, $func, $b) { &$func $a $b }
abc 10 { param($a, $b); $a+$b } 20

(打印出30。)您可以使用param块执行您通常想要的任何操作,包括验证。

abc 10 {param([parameter(Mandatory=$true)]$a, [parameter(Mandatory=$true)]$b); $a+$b} 20

或者,预定义这样的函数:

$bcd = { param($a, $b); $a+$b }

继续像往常一样:

abc 10 $bcd 20

答案 1 :(得分:1)

除非出于某种原因需要将传递的函数调用隔离到它自己的作用域,否则只需传递一个脚本块并在函数的本地作用域中调用它就可以简化它:

function abc($a, $func, $b) {.$func}
abc 10 {$a+$b} 20
30