hack集合:Typing

2018-10-20 11:44 更新

您通常將通過具體類實(shí)例化Hack集合對象。但是,什么參數(shù)類型被接受或從方法返回可能是其中一個接口。

以下示例顯示如何將任何具體的類傳遞給需要的函數(shù)Iterable<T>。在這些情況下T,代表每個集合的值的類型。所以int對于$v和string為$m。對于地圖,在這種情況下,鍵的類型并不重要。

<?hh

namespace Hack\UserDocumentation\Collections\Typing\Examples\Iter;

// Given that this function takes an Iterable, you can pass any of
// our current concerte collection classes to this method
function take_iterable<T>(Iterable<T> $it): array<T> {
  return $it->toValuesArray();
}

function run(): void {
  $v = Vector {100, 200, 300};
  var_dump(take_iterable($v));
  $iv = ImmVector {400, 500, 600};
  var_dump(take_iterable($iv));
  $s = Set {'A', 'B'};
  var_dump(take_iterable($s));
  $is = ImmSet {'C', 'D'};
  var_dump(take_iterable($is));
  $m = Map {'A' => 'Z', 'B' => 'Y'};
  var_dump(take_iterable($m));
  $im = ImmMap {'C' => 'X', 'D' => 'W'};
  var_dump(take_iterable($im));
}

run();

Output

array(3) {
  [0]=>
  int(100)
  [1]=>
  int(200)
  [2]=>
  int(300)
}
array(3) {
  [0]=>
  int(400)
  [1]=>
  int(500)
  [2]=>
  int(600)
}
array(2) {
  [0]=>
  string(1) "A"
  [1]=>
  string(1) "B"
}
array(2) {
  [0]=>
  string(1) "C"
  [1]=>
  string(1) "D"
}
array(2) {
  [0]=>
  string(1) "Z"
  [1]=>
  string(1) "Y"
}
array(2) {
  [0]=>
  string(1) "X"
  [1]=>
  string(1) "W"
}

以下示例顯示了如何使用它ConstVector來確保傳遞不能修改的向量。你可能會問為什么不注釋它ImmVector?那是因?yàn)槟憧梢韵胂笪磥韺?shí)施的其他不變的向量 并且由于所有不可變的向量必須實(shí)現(xiàn)ConstVector,所以更具有表現(xiàn)力ConstVector。返回類型也采用相同的理由MutableVector

現(xiàn)在,如果你知道這個函數(shù)只會占用一個ImmVector現(xiàn)在和永遠(yuǎn),那么鍵入注釋ImmVector就可以了。

<?hh

namespace Hack\UserDocumentation\Collections\Typing\Examples\CV;

// Given that this function takes a ConstVector, you can pass any concrete
// collection that implements the interface (currently Vector and ImmVector)
function filter_vec(\ConstVector<int> $cv): \MutableVector<int> {
  try {
    $cv[] = 900; // cannot modify a ConstVector
  } catch (\InvalidOperationException $ex) {
    var_dump($ex->getMessage());
  }
  $mv = $cv->filter($x ==> $x % 4 === 0);
  return $mv->toVector();
}

function run(): void {
  $iv = ImmVector {100, 125, 150, 175};
  var_dump(filter_vec($iv));
}

run();

Output

string(51) "Cannot modify immutable object of type HH\ImmVector"
object(HH\Vector)#5 (1) {
  [0]=>
  int(100)
}


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

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號