1

ハックラムダ式でレキシカルスコープの変数の値を変更することは可能ですか?

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 ラムダ式はこれをサポートしていません。ただし、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 

これが機能する理由: ラムダ式の構文と PHP 5.3 のクロージャー構文で作成されたタイプ Closure のオブジェクトは交換可能です。

ドキュメントから

注:
現在、作業中または検討中のラムダ式にはいくつかの制限があります。

ラムダ式は、参照による変数のキャプチャをサポートしていません。プログラマーが参照によって変数を取得したい場合は、PHP 5.3 クロージャー構文を使用し、「use(..)」リスト内の変数の前に「&」を配置する必要があります。

現在、ラムダ式は参照による戻りをサポートしていませんが、将来サポートが追加される可能性があります。

于 2014-12-06T16:47:26.713 に答える