hack集合:Read Write

2018-10-25 11:15 更新

像数组一样,您可以使用方括号syntax([])来从Hack集合读取和写入。

从集合中读取几种方法。您可以使用[],调用类似的方法Set::contains()Vector::containsKey()或喜欢使用的功能isset()empty()

方括号语法 []

您可以使用方括号语法从集合中读取。

echo $ coll [$ key];
<?hh

namespace Hack\UserDocumentation\Collections\ReadWrite\Examples\ReadSquareBrack;

function run(): void {
  $vec = Vector {'A', 'B', 'C'};
  var_dump($vec[1]); // 'B'

  $map = Map {'A' => 1, 'B' =>2};
  var_dump($map['B']); // 2

  $pair = Pair {100, 200};
  var_dump($pair[0]); // 100
}

run();

Output

string(1) "B"
int(2)
int(100)

Sets没有键,所以使用方括号语法进行阅读有一点奇怪,虽然可以在运行时执行。然而,Hack typechecker会抛出错误。您基本上用$key您正在寻找的集合中的值替换上述值。由于它是令人困惑的,而是更好地使用Set::contains()

<?hh

namespace Hack\UserDocumentation\Collections\ReadWrite\Examples\ReadSqBrackSet;

function run(): void {
  $set = Set {100, 200, 300, 400};
  // Using [] with a Set is allowed at runtime, but confusing.
  // You are checking for existence of a value, not a key, since sets don't
  // have keys. The Hack typechecker will throw an error here.
  var_dump($set[100]); // Outputs 100. Seems strange that you would do this.
  // Normally, you are checking a set if it contains a value
  var_dump($set->contains(100)); // true
}

run();

Output

int(100)
bool(true)

如果使用方括号从集合中读取,并且该集合中不存在该键(或者a的值Set),则不用 OutOfBoundsException 。

<?hh

namespace Hack\UserDocumentation\Collections\ReadWrite\Examples\ReadOutOfBounds;

function run(): void {
  $set = Set {100, 200, 300, 400};
  $map = Map {'A' => 1, 'B' =>2};
  try {
    $a = $set[999];
  } catch (\OutOfBoundsException $ex) {
    var_dump($ex->getMessage()); // 999 not a defined key
  }
  try {
    $a = $map['C'];
  } catch (\OutOfBoundsException $ex) {
    var_dump($ex->getMessage()); // 'C' not a defined key
  }
}

run();

Output

string(30) "Integer key 999 is not defined"
string(29) "String key "C" is not defined"

检索功能

除了使用方括号语法[]从集合中获取值,则对方法VectorMapPair 以给定一个键,得到的值。由于a Set没有键,这些方法不适用。

  • at()(例如,Vector::at())检索指定键的值; 如果没有找到提供的密钥,OutOfBoundsException则抛出一个。
  • get()(例如Vector::get())检索指定键的值; 如果未找到提供的密钥,null则返回。使用get()安全地尝试从密钥可能不存在得到的值。

包含功能

要想测试是否存在的关键Vector,Map或者Pair,你也可以使用Vector::containsKey()Map::containsKey()Pair::containsKey()方法,分别。使用containsKey()相反的方法[]可以避免OutOfBoundsException被抛出的可能性。

对于a Set,用于Set::contains()检查集合中是否存在值。

<?hh

namespace Hack\UserDocumentation\Collections\ReadWrite\Examples\ReadContains;

function run(): void {
  $vec = Vector {'A', 'B', 'C'};
  if ($vec->containsKey(2)) {
    var_dump($vec[2]); // 'C'
  } else {
    var_dump('Move on, but at least no OutOfBoundsException');
  }
  // We can avoid of OutOfBoundsException by using contains()
  if ($vec->containsKey(3)) {
    var_dump($vec[3]); // Doesn't exist
  } else {
    var_dump('Move on, but at least no OutOfBoundsException');
  }
}

run();

Output

string(1) "C"
string(45) "Move on, but at least no OutOfBoundsException"

注意:使用Map::contains()是同义词Map::containsKey()

您还可以使用isset()empty()用于键(或值集合)测试。请注意,Hack的严格模式不支持这些功能。

<?hh

namespace Hack\UserDocumentation\Collections\ReadWrite\Examples\ReadIsset;

// Be aware, isset() and empty() fail typechecking in strict mode.
function run(): void {
  $vec = Vector {'A', 'B', 'C'};
  if (isset($vec[2])) {
    var_dump($vec[2]); // 'C'
  } else {
    var_dump('Move on, but at least no OutOfBoundsException');
  }
  // We can avoid of OutOfBoundsException by using isset()
  if (isset($vec[3])) {
    var_dump($vec[3]); // Doesn't exist
  } else {
    var_dump('Move on, but at least no OutOfBoundsException');
  }
}

run();

Output

string(1) "C"
string(45) "Move on, but at least no OutOfBoundsException"

注意:您可以使用其他阵列功能,如array_key_exists()array_keys()与哈克收藏为好。

Write

方括号语法 []

您可以使用空的方式将值附加到Vectors和Sets []。

对于Maps,您有两种方法来附加值[]。

$ map [newKey] = value; 
$ map [] = Pair {key,value};

你不能附加一个值Pair。一个InvalidOperationException将被抛出,而Hack typechecker会抛出一个错误。

<?hh

namespace Hack\UserDocumentation\Collections\ReadWrite\Examples\WriteSqBracket;

function run(): void {
  $vec = Vector {'A', 'B', 'C'};
  $vec[] = 'D'; // The index will be 3
  var_dump($vec[3]); // 'D'

  $map = Map {'A' => 1, 'B' =>2};
  $map['C'] = 3;
  $map[] = Pair {'D', 4}; // 'D' is key, 4 is value
  var_dump($map['C']); // 3
  var_dump($map['D']); // 4

  $pair = Pair {100, 200};
  try {
    // We cannot add a value to a pair, for obvious reasons
    $pair[] = 300;
  } catch (\InvalidOperationException $ex) {
    var_dump($ex->getMessage());
  }
}

run();

Output

string(1) "D"
int(3)
int(4)
string(46) "Cannot modify immutable object of type HH\Pair"

附加方法

您还可以使用Vector::add()Set::add()传递要添加到Vector或Set分别的值。对于Maps,你可以使用Map::add(),但通过Pair一个钥匙和价值。

删除方法

要从a中删除一个值Vector,请使用Vector::removeKey(),传递索引n以进行删除。这将删除该索引,与该索引相关联的值,最后将所有索引向下移动n + 1到最终索引。

要从a中删除一个值Map,您还可以使用Map::removeKey(),传入键以删除。

要从a中删除一个值Set,请使用Set::remove(),传递要删除的集合中的值。

您不能从a中删除值Pair。

<?hh

namespace Hack\UserDocumentation\Collections\ReadWrite\Examples\Delete;

function run(): void {
  $vec = Vector {'A', 'B', 'C'};
  $vec->removeKey(1);
  var_dump($vec[1]); // 'C' because its index is shifted back one

  $map = Map {'A' => 1, 'B' =>2};
  $map->removeKey('B');
  var_dump($map->containsKey('B'));

  $set = Set {1000, 2000, 3000, 4000};
  $set->remove(3000);
  var_dump($set);
}

run();

Output

string(1) "C"
bool(false)
object(HH\Set)#3 (3) {
  int(1000)
  int(2000)
  int(4000)
}

注意:您可以使用unset()MapSet,但不是VectorVector在移除后移动索引,但数组不会,unset()原来是用于数组。

以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号