Lambdas介紹

2018-11-21 10:52 更新

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ì)了解更多信息。

區(qū)別于傳統(tǒng)的關(guān)閉

這個(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)閉。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號