是否可以在Hack lambda表达式中更改词法范围变量的值?
function allTrue(Map<string, bool> $map): bool {
$valid = 1;
$map->map($a ==> $valid &= $a);
return $valid === 1;
}
$map = Map{'foo' => true, 'bar' => false };
var_dump(allTrue($map)); // true
我希望返回值为false
答案 0 :(得分:2)
不幸的是,Hack lambda表达式不支持这一点。但是,您仍然可以使用PHP 5.3闭包语法。
function allTrue(Map<string, bool> $map): bool {
$valid = 1;
$map->map(function ($a) use (&$valid) {
$valid &= $a;
});
return $valid === 1;
}
$map = Map{'foo' => true, 'bar' => false };
var_dump(allTrue($map)); // false
这是因为:由lambda表达式语法与PHP 5.3的闭包语法创建的Closure类型的对象是可互换的;
注意:
目前lambda表达式存在一些限制 正在研究或考虑:Lambda表达式不支持 通过引用捕获变量。如果程序员想要捕获 通过引用变量,它们必须使用PHP 5.3闭包语法并放入 “&安培;”在“use(..)”列表中的变量前面。
Lambda表达式 不支持目前通过引用返回,但可以支持 在未来添加。
答案 1 :(得分:0)
截至 2019 年,用户还可以使用 Ref
解决此问题。
function allTrue(Map<string, bool> $map): bool {
$valid = Ref(1);
$map->map($a ==> $valid->set($a));
return $valid->get() === 1;
}
$map = Map{'foo' => true, 'bar' => false };
var_dump(allTrue($map));
见:https://hhvm.com/blog/2019/10/01/deprecating-references.html