次のように機能する関数「calc」を実現する必要があります。
$sum = function($a, $b) { return $a + $b; };
calc(5)(3)(2)($sum); // 10
calc(1)(2)($sum); // 3
calc(2)(3)('pow'); // 8
私はこのようなものを書くことができます:
function calc(){;
print_r(func_get_args());
return __FUNCTION__;
}
calc(3)(5)(2)('sum');
そしてそれは印刷しますArray ( [0] => 3 ) Array ( [0] => 5 ) Array ( [0] => 2 ) Array ( [0] => sum )
。
したがって、関数で「sum」を取得すると、以前のすべての引数を含む配列が必要になります。しかし、私にはわかりません。次の関数呼び出しで現在の引数を渡して、最後の反復でそれらすべてを操作するにはどうすればよいですか。それとも、ある種の再帰的な解決策はありますか?
あなたが話しているのはカリー化と呼ばれています。次のコードにはPHP7が必要です。これは、別の関数から返された関数を呼び出す必要があるためです。これは、PHPの抽象構文ツリーがそのバージョンで実装されるまで不可能でした。
まず最初sum()
に、任意の数の変数を操作できる新しい関数が必要になります。
$sum = function(...$args) { return array_sum($args); };
第二に、重要な部分です。新しい無名関数を返し、引数を累積していく関数。最終的に呼び出し可能なもの($sum
関数、またはのような組み込み関数名のいずれか)を渡すとpow
、それが実行され、構築された引数が解凍されます。
function calc($x)
{
return function($y = null) use ($x)
{
if (is_callable($y)) {
return $y(...$x);
} else {
$args = (array) $x;
$args[] = $y;
return calc($args);
}
};
}
echo calc(5)(3)(2)($sum); // 10
echo calc(1)(2)($sum); // 3
echo calc(2)(3)('pow'); // 8
https://3v4l.org/r0emmを参照してください
(内部関数は、取るように定義されている引数の数での操作に制限されることに注意してください-calc(2)(3)(4)('pow')
エラーが発生します。)
これは特に一般的なパターンではないので(おそらく追跡が難しいと感じた理由です)、それを読むすべての人がどこで使用するかを慎重に検討してください。
スターティングブロックについてはcurryAdd
、この質問の回答の功績によるものです。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加