W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
Hack支持通過名為lambda的構(gòu)造來創(chuàng)建閉包。Lambdas通常不像PHP關(guān)閉那么冗長,經(jīng)常和類似的函數(shù)一起使用array_filter()
要么 array_map()
。
一個(gè)lambda由lambda運(yùn)算符 引入==>
。左邊==>
是關(guān)閉的參數(shù)列表。右邊是一個(gè)用大括號括起來的表達(dá)式或者語句列表{}
。請參閱lambda設(shè)計(jì)了解更多信息。
這個(gè)例子展示了如何使用更短的lambda語法。它還使用了一個(gè)Vector,這是Hack的集合類之一。
<?hh
namespace Hack\UserDocumentation\Lambdas\Examples\Examples\Introduction;
function addLastname(): Vector<string> {
$people = Vector {
"Carlton",
"Will",
"Phil"
};
return $people->map($name ==> $name . " Banks");
}
function run(): void {
var_dump(addLastname());
}
run();
Output
object(HH\Vector)#3 (3) {
[0]=>
string(13) "Carlton Banks"
[1]=>
string(10) "Will Banks"
[2]=>
string(10) "Phil Banks"
}
上面的例子等價(jià)于下面的例子,使用PHP的匿名函數(shù)的傳統(tǒng)語法。您應(yīng)該看到,lambda使代碼更易讀,更短。
<?hh
namespace Hack\UserDocumentation\Lambdas\Examples\Examples\Difference;
function addLastnameTraditional(): array<string> {
$people = array(
"Carlton",
"Will",
"Phil"
);
return array_map(function ($name) {
return $name . " Banks";
}, $people);
}
function run(): void {
var_dump(addLastnameTraditional());
}
run();
Output
array(3) {
[0]=>
string(13) "Carlton Banks"
[1]=>
string(10) "Will Banks"
[2]=>
string(10) "Phil Banks"
}
從本質(zhì)上講,傳統(tǒng)封閉function ($name)和return從傳統(tǒng)封閉取而代之的是更短$name ==>。
PHP提供關(guān)鍵字use來捕獲封閉范圍中的變量。Hack的lambda使這更容易。你可以在lambda中隱式使用變量。
<?hh
namespace Hack\UserDocumentation\Lambdas\Examples\Examples\CaptureVariables;
function addLastname(string $lastname): Vector<string> {
$people = Vector {
"Carlton",
"Will",
"Phil"
};
return $people->map($name ==> $name . " " . $lastname);
}
function addLastnameTraditional(string $lastname): array<string> {
$people = array(
"Carlton",
"Will",
"Phil"
);
return array_map(function ($name) use ($lastname) {
return $name . " " . $lastname;
}, $people);
}
function run(): void {
var_dump(addLastnameTraditional("Smith"));
var_dump(addLastname("Smith"));
}
run();
Output
array(3) {
[0]=>
string(13) "Carlton Smith"
[1]=>
string(10) "Will Smith"
[2]=>
string(10) "Phil Smith"
}
object(HH\Vector)#8 (3) {
[0]=>
string(13) "Carlton Smith"
[1]=>
string(10) "Will Smith"
[2]=>
string(10) "Phil Smith"
}
請注意,addLastName()我們$lastname直接在lambda 中使用傳入的參數(shù),而在in中addLastNameTraditional,參數(shù)$lastName必須明確捕獲并在a中調(diào)用use。
注意:所有捕獲的變量都是按值捕獲的; 不支持通過引用進(jìn)行捕獲。如果您需要通過引用捕獲,請使用完整的PHP關(guān)閉。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: