在HHVM / Hack lambda表达式中更改词法范围变量的值?

时间:2014-12-06 16:47:27

标签: 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)); // true

我希望返回值为false

2 个答案:

答案 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类型的对象是可互换的;

From the docs

  

注意:
  目前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