此函数接受两个值和一个函数,并使用两个值调用该函数:
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
。
这被认为是将函数传递给另一个函数的可接受方式吗?我见过的大多数例子都建议在脚本块中传递一个函数,该函数将在接收函数中调用。然而,这种方法比上述方法更冗长。
答案 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