在火柴臂中使用闭合

问题描述

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

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

解决方法

只需将闭包包裹在 aws-cli container uses 中:

$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 的一个提示以指出它call_user_func):

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

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