hack集合:Constructing

2018-10-24 11:01 更新

使用Hack集合與使用數(shù)組非常相似。事實上,您可以使用Hack集合在常規(guī)<?php文件中,因為它們直接構(gòu)建到HHVM運行時(唯一的注意事項是在<?php文件中,必須使用前綴HH\)。

構(gòu)建Hack集合可以使用new或稱為文字語法來完成。這兩個都基本上是如何創(chuàng)建數(shù)組的混合。

文字句法

如果要創(chuàng)建Hack集合并提供集合顯式值(或鍵/值對),則要使用文字語法。

$collection = <CollectionType> { val1, val2, ... , valN };
$collection = <KeyedCollectionType> { key1 => val1, key2 => val2, ... , keyN => valN}
<?hh

namespace Hack\UserDocumentation\Collections\Constructing\Examples\Literal;

function run(): void {
  $vec = Vector {'A', 'B', 'C'};
  $ivec = ImmVector {'A', 'B', 'C'};
  $map = Map {'A' => 1, 'B' => 2, 'C' => 3};
  $set = Set {'A', 'B', 'C'};
  $pair = Pair {'A', 'B'};

  var_dump($vec);
  var_dump($ivec);
  var_dump($map);
  var_dump($set);
  var_dump($pair);
}

run();

Output

object(HH\Vector)#1 (3) {
  [0]=>
  string(1) "A"
  [1]=>
  string(1) "B"
  [2]=>
  string(1) "C"
}
object(HH\ImmVector)#2 (3) {
  [0]=>
  string(1) "A"
  [1]=>
  string(1) "B"
  [2]=>
  string(1) "C"
}
object(HH\Map)#3 (3) {
  ["A"]=>
  int(1)
  ["B"]=>
  int(2)
  ["C"]=>
  int(3)
}
object(HH\Set)#4 (3) {
  string(1) "A"
  string(1) "B"
  string(1) "C"
}
object(HH\Pair)#5 (2) {
  [0]=>
  string(1) "A"
  [1]=>
  string(1) "B"
}

您可以在任何地方使用文字語法array(),包括初始化對象或類屬性的表達(dá)式。

<?hh

namespace Hack\UserDocumentation\Collections\Constructing\Examples\ClassProp;

class A {
  public static Map<int, string> $users = Map {};
  public static array<int, string> $users_a = array();
  // Cannot do something like this because function calls
  // aren't allowed in static class property initializers
  //public static Map<int, string> $users_bad = Map {rand(0, 10) => 'a'};
}

function run(): void {
  A::$users[0] = "Joel";
  A::$users_a[0] = "Fred";
  var_dump(A::$users);
  var_dump(A::$users_a);
}

run();

Output

object(HH\Map)#1 (1) {
  [0]=>
  string(4) "Joel"
}
array(1) {
  [0]=>
  string(4) "Fred"
}

沒有用于文字語法的類型參數(shù)(例如,$v = Vector<int> {1};是語法錯誤)。該typechecker將推斷和跟蹤類型的內(nèi)部。

運用 new

您還可以使用new創(chuàng)建Hack集合的實例。但是,您必須傳遞構(gòu)造函數(shù)a Traversable(像數(shù)組)或null。

$ collection = new <CollectionType>(?Traversable <Tv> $ t); 
$ collection = new <KeyedCollectionType>(?KeyedTraversable <Tk,Tv> $ t);
<?hh

namespace Hack\UserDocumentation\Collections\Constructing\Examples\UsingNew;

function convert(array<int> $arr): Vector<int> {
  var_dump($arr instanceof Traversable);
  return new Vector($arr);
}

function run(): void {
  $arr = array(1, 2, 3);
  var_dump(convert($arr));
}

run();

Output

bool(true)
object(HH\Vector)#1 (3) {
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  int(3)
}
以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號