【问题标题】:Use closures in match arms [duplicate]在匹配臂中使用闭包[重复]
【发布时间】:2021-05-08 17:17:15
【问题描述】:

当我以condition_2 作为匹配结果运行以下代码时,$foo 的内容是一个闭包实例,但我想要该闭包应该返回的结果。你怎么做到这一点? condition_1 正在按预期工作。

$foo = match ($conditions) {
    'condition_1' => 'some text',
    'condition_2' => function () {
        $result = '';
        // crazy programming
        return $result;
    }
}

【问题讨论】:

    标签: php match php-8


    【解决方案1】:

    只需将闭包包裹在call_user_func

    $conditions = 'condition_2';
    $foo = match ($conditions) {
        'condition_1' => 'some text',
        'condition_2' => call_user_func(function () {
            $result = 'crazy';
            // crazy programming
            return $result;
        })
    };
    var_dump($foo);
    

    此代码将导致string(5) "crazy" 的输出。

    或者,您可以将闭包存储在一个变量中,然后调用它:

    $myCallback = function () {
        $result = 'crazy';
        // crazy programming
        return $result;
    };
    $conditions = 'condition_2';
    $foo = match ($conditions) {
        'condition_1' => 'some text',
        'condition_2' => $myCallback()
    };
    

    还有第三种解决方法,如果您添加额外的括号组,您可以立即调用闭包(IMSoP 指出这一点in the comments):

    'condition_2' => (function () {
        $result = 'crazy';
        // crazy programming
        return $result;
    })()
    

    第一个集合包装了闭包并允许它被解释(...closure definition...),第二个是一个空集合,表示函数的调用:wrapper -->(...closure definition...)()<-- call。也许可读性稍差,但消除了任何中间人(中间变量或对另一个函数的调用)。

    【讨论】:

    猜你喜欢
    • 2021-05-09
    • 1970-01-01
    • 1970-01-01
    • 2015-06-23
    • 1970-01-01
    • 2017-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多