1

是否可以在 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

4

2 回答 2

3

不幸的是,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 的闭包语法是可互换的;

从文档

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

Lambda 表达式不支持通过引用捕获变量。如果程序员想通过引用来捕获变量,他们必须使用 PHP 5.3 闭包语法并将“&”放在“use(..)”列表中的变量前面。

Lambda 表达式目前不支持引用返回,但未来可能会增加支持。

于 2014-12-06T16:47:26.713 回答
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

于 2021-07-29T18:45:33.273 回答