PHPでfunc(a)(b)(c)のように呼び出すことができる関数を作成するにはどうすればよいですか?

自由の死から

次のように機能する関数「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」を取得すると、以前のすべての引数を含む配列が必要になります。しかし、私にはわかりません。次の関数呼び出しで現在の引数を渡して、最後の反復でそれらすべてを操作するにはどうすればよいですか。それとも、ある種の再帰的な解決策はありますか?

iainn

あなたが話しているのはカリー化と呼ばれています。次のコードには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]

編集
0

コメントを追加

0

関連記事

分類Dev

特定の関数が呼び出されたときに関数を呼び出す関数を作成するにはどうすればよいですか?

分類Dev

終了する前に複数回呼び出すことができるタイマー関数を作成するにはどうすればよいですか?

分類Dev

DBeaverから呼び出すことができるPostgreSQL関数を作成するにはどうすればよいですか?

分類Dev

DBeaverから呼び出すことができるPostgreSQL関数を作成するにはどうすればよいですか?

分類Dev

このC関数を作成して、ユーザーが後で「free」を使用せずに呼び出すことができるようにするにはどうすればよいですか?

分類Dev

WebJobのJobHost.CallAsyncを介して呼び出すことができるF#で関数を宣言するにはどうすればよいですか?

分類Dev

Express jsの任意のビューから呼び出すことができる関数を宣言するにはどうすればよいですか?

分類Dev

関数Bが呼び出された後にのみ関数Aが呼び出されるようにするにはどうすればよいですか?

分類Dev

AndroidEditTextに入力するときに関数を呼び出すにはどうすればよいですか

分類Dev

引数なしで呼び出すことができる__VA_ARGS__マクロを作成するにはどうすればよいですか?

分類Dev

IDLE で関数を呼び出すときに独自の「ヒント」を作成するにはどうすればよいですか?

分類Dev

構造体の寿命を延ばして、tokio :: runを呼び出すことができるようにするにはどうすればよいですか?

分類Dev

この関数の呼び出しを単純化するにはどうすればよいですか?

分類Dev

他の関数ではなく、REPLからのみ関数を呼び出すことを許可するにはどうすればよいですか?

分類Dev

べき等関数への追加の呼び出しを削除するにはどうすればよいですか?

分類Dev

Python psutilで関数が呼び出されたときにCPUの使用状況を監視するにはどうすればよいですか?

分類Dev

特定の引数のセットで呼び出すことができる関数が存在するかどうかをコンパイル時に確認するにはどうすればよいですか?

分類Dev

reactjsの状態が更新されていることを確認してから、関数を呼び出すにはどうすればよいですか?

分類Dev

PHPで関数を異なる順序で呼び出すにはどうすればよいですか?

分類Dev

DataFrame.agg()のfunc引数に文字列を使用するときに、どの関数が呼び出されているかを知るにはどうすればよいですか?

分類Dev

後で呼び出すことができるように関数を渡すことはできますか?

分類Dev

Javascriptの無名関数で関数を呼び出すときに「this」キーワードを使用するにはどうすればよいですか?

分類Dev

関数の外部で値を呼び出すことができるように、関数の結果を保存するにはどうすればよいですか?

分類Dev

異なる引数/変数を使用してプレイブックで複数回呼び出すことができるタスクで構成される再利用可能な「関数」を作成するにはどうすればよいですか?

分類Dev

Lambda関数がawaitで非同期関数の呼び出しを待機するようにするにはどうすればよいですか?

分類Dev

ナビゲーションの戻るボタンが押されたときに関数を呼び出すにはどうすればよいですか?

分類Dev

モック関数がジェネレーターで呼び出されていることを表明するにはどうすればよいですか?

分類Dev

呼び出されたメソッドごとに戻り値の型が静的に推測できるかどうかをチェックする関数を作成するにはどうすればよいですか?

分類Dev

'--help'が呼び出されたことを検出するにはどうすればよいですか?

Related 関連記事

  1. 1

    特定の関数が呼び出されたときに関数を呼び出す関数を作成するにはどうすればよいですか?

  2. 2

    終了する前に複数回呼び出すことができるタイマー関数を作成するにはどうすればよいですか?

  3. 3

    DBeaverから呼び出すことができるPostgreSQL関数を作成するにはどうすればよいですか?

  4. 4

    DBeaverから呼び出すことができるPostgreSQL関数を作成するにはどうすればよいですか?

  5. 5

    このC関数を作成して、ユーザーが後で「free」を使用せずに呼び出すことができるようにするにはどうすればよいですか?

  6. 6

    WebJobのJobHost.CallAsyncを介して呼び出すことができるF#で関数を宣言するにはどうすればよいですか?

  7. 7

    Express jsの任意のビューから呼び出すことができる関数を宣言するにはどうすればよいですか?

  8. 8

    関数Bが呼び出された後にのみ関数Aが呼び出されるようにするにはどうすればよいですか?

  9. 9

    AndroidEditTextに入力するときに関数を呼び出すにはどうすればよいですか

  10. 10

    引数なしで呼び出すことができる__VA_ARGS__マクロを作成するにはどうすればよいですか?

  11. 11

    IDLE で関数を呼び出すときに独自の「ヒント」を作成するにはどうすればよいですか?

  12. 12

    構造体の寿命を延ばして、tokio :: runを呼び出すことができるようにするにはどうすればよいですか?

  13. 13

    この関数の呼び出しを単純化するにはどうすればよいですか?

  14. 14

    他の関数ではなく、REPLからのみ関数を呼び出すことを許可するにはどうすればよいですか?

  15. 15

    べき等関数への追加の呼び出しを削除するにはどうすればよいですか?

  16. 16

    Python psutilで関数が呼び出されたときにCPUの使用状況を監視するにはどうすればよいですか?

  17. 17

    特定の引数のセットで呼び出すことができる関数が存在するかどうかをコンパイル時に確認するにはどうすればよいですか?

  18. 18

    reactjsの状態が更新されていることを確認してから、関数を呼び出すにはどうすればよいですか?

  19. 19

    PHPで関数を異なる順序で呼び出すにはどうすればよいですか?

  20. 20

    DataFrame.agg()のfunc引数に文字列を使用するときに、どの関数が呼び出されているかを知るにはどうすればよいですか?

  21. 21

    後で呼び出すことができるように関数を渡すことはできますか?

  22. 22

    Javascriptの無名関数で関数を呼び出すときに「this」キーワードを使用するにはどうすればよいですか?

  23. 23

    関数の外部で値を呼び出すことができるように、関数の結果を保存するにはどうすればよいですか?

  24. 24

    異なる引数/変数を使用してプレイブックで複数回呼び出すことができるタスクで構成される再利用可能な「関数」を作成するにはどうすればよいですか?

  25. 25

    Lambda関数がawaitで非同期関数の呼び出しを待機するようにするにはどうすればよいですか?

  26. 26

    ナビゲーションの戻るボタンが押されたときに関数を呼び出すにはどうすればよいですか?

  27. 27

    モック関数がジェネレーターで呼び出されていることを表明するにはどうすればよいですか?

  28. 28

    呼び出されたメソッドごとに戻り値の型が静的に推測できるかどうかをチェックする関数を作成するにはどうすればよいですか?

  29. 29

    '--help'が呼び出されたことを検出するにはどうすればよいですか?

ホットタグ

アーカイブ