在火柴臂中使用闭合件
Use closures in match arms
当我运行下面的代码以condition_2
作为匹配结果时$foo
的内容是一个闭包实例,但我想要该闭包应该返回的结果.你怎么做到这一点? condition_1
正在按预期工作。
$foo = match ($conditions) {
'condition_1' => 'some text',
'condition_2' => function () {
$result = '';
// crazy programming
return $result;
}
}
只需将闭包包裹在 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
。可读性可能稍差,但消除了任何中间人(中间变量或对另一个函数的调用)。
当我运行下面的代码以condition_2
作为匹配结果时$foo
的内容是一个闭包实例,但我想要该闭包应该返回的结果.你怎么做到这一点? condition_1
正在按预期工作。
$foo = match ($conditions) {
'condition_1' => 'some text',
'condition_2' => function () {
$result = '';
// crazy programming
return $result;
}
}
只需将闭包包裹在 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
。可读性可能稍差,但消除了任何中间人(中间变量或对另一个函数的调用)。