是否更改HHVM/Hack lambda表达式中词汇范围变量的值?

是否更改HHVM/Hack lambda表达式中词汇范围变量的值?,lambda,closures,hhvm,lexical-scope,hacklang,Lambda,Closures,Hhvm,Lexical Scope,Hacklang,是否可以更改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));

是否可以更改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
函数allTrue(Map$Map):bool{
$valid=1;
$map->map($a==>$valid&=$a);
返回$valid==1;
}
$map=map{'foo'=>true,'bar'=>false};
变量转储(allTrue($map));//真的

我希望返回值为
false

不幸的是,Hack lambda表达式不支持这一点。但是,您仍然可以使用PHP5.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 
函数allTrue(Map$Map):bool{
$valid=1;
$map->map(函数($a)使用(&$valid){
$valid&=$a;
});
返回$valid==1;
}
$map=map{'foo'=>true,'bar'=>false};
变量转储(allTrue($map));//假的
这是因为:由lambda表达式语法创建的Closure类型的对象与PHP5.3的Closure语法是可互换的

注:
目前,lambda表达式存在一些限制: 正在研究或考虑:

Lambda表达式不支持 通过引用捕获变量。如果程序员想要捕获 通过引用变量,它们必须使用PHP5.3闭包语法和put “使用(…)”列表中变量前面的“&”

Lambda表达式 目前不支持通过引用返回,但支持可以是 在将来添加