在火柴臂中使用闭合 [复制]

Use closures in match arms [duplicate]

提问人:Niwo 提问时间:5/9/2021 更新时间:5/10/2021 访问量:2286

问:

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

$foo = match ($conditions) {
    'condition_1' => 'some text',
    'condition_2' => function () {
        $result = '';
        // crazy programming
        return $result;
    }
}
PHP 匹配 php-8

评论


答:

10赞 El_Vanja 5/9/2021 #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 在评论中指出它的提示):

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

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

评论

0赞 El_Vanja 5/9/2021
对第一个解决方案和选解决方案进行实时测试。
5赞 IMSoP 5/10/2021
实际上,您可以在没有call_user_func或中间变量的情况下直接执行闭包,但最终会得到很多不同的括号: 3v4l.org/gWS2j