hack集合:Constructing

2018-10-24 11:01 更新

使用Hack集合与使用数组非常相似。事实上,您可以使用Hack集合在常规<?php文件中,因为它们直接构建到HHVM运行时(唯一的注意事项是在<?php文件中,必须使用前缀HH\)。

构建Hack集合可以使用new或称为文字语法来完成。这两个都基本上是如何创建数组的混合。

文字句法

如果要创建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(),包括初始化对象或类属性的表达式。

<?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"
}

没有用于文字语法的类型参数(例如,$v = Vector<int> {1};是语法错误)。该typechecker将推断和跟踪类型的内部。

运用 new

您还可以使用new创建Hack集合的实例。但是,您必须传递构造函数a Traversable(像数组)或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)
}
以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号