hack集合:Read Write

2018-10-25 11:15 更新

像數(shù)組一樣,您可以使用方括號(hào)syntax([])來(lái)從Hack集合讀取和寫入。

從集合中讀取幾種方法。您可以使用[],調(diào)用類似的方法Set::contains()Vector::containsKey()或喜歡使用的功能isset()empty()。

方括號(hào)語(yǔ)法 []

您可以使用方括號(hào)語(yǔ)法從集合中讀取。

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沒(méi)有鍵,所以使用方括號(hào)語(yǔ)法進(jìn)行閱讀有一點(diǎn)奇怪,雖然可以在運(yùn)行時(shí)執(zhí)行。然而,Hack typechecker會(huì)拋出錯(cuò)誤。您基本上用$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)

如果使用方括號(hào)從集合中讀取,并且該集合中不存在該鍵(或者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"

檢索功能

除了使用方括號(hào)語(yǔ)法[]從集合中獲取值,則對(duì)方法Vector,MapPair 以給定一個(gè)鍵,得到的值。由于a Set沒(méi)有鍵,這些方法不適用。

  • at()(例如,Vector::at())檢索指定鍵的值; 如果沒(méi)有找到提供的密鑰,OutOfBoundsException則拋出一個(gè)。
  • get()(例如Vector::get())檢索指定鍵的值; 如果未找到提供的密鑰,null則返回。使用get()安全地嘗試從密鑰可能不存在得到的值。

包含功能

要想測(cè)試是否存在的關(guān)鍵Vector,Map或者Pair,你也可以使用Vector::containsKey(),Map::containsKey()Pair::containsKey()方法,分別。使用containsKey()相反的方法[]可以避免OutOfBoundsException被拋出的可能性。

對(duì)于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()用于鍵(或值集合)測(cè)試。請(qǐng)注意,Hack的嚴(yán)格模式不支持這些功能。

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

方括號(hào)語(yǔ)法 []

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

對(duì)于Maps,您有兩種方法來(lái)附加值[]。

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

你不能附加一個(gè)值Pair。一個(gè)InvalidOperationException將被拋出,而Hack typechecker會(huì)拋出一個(gè)錯(cuò)誤。

<?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分別的值。對(duì)于Maps,你可以使用Map::add(),但通過(guò)Pair一個(gè)鑰匙和價(jià)值。

刪除方法

要從a中刪除一個(gè)值Vector,請(qǐng)使用Vector::removeKey(),傳遞索引n以進(jìn)行刪除。這將刪除該索引,與該索引相關(guān)聯(lián)的值,最后將所有索引向下移動(dòng)n + 1到最終索引。

要從a中刪除一個(gè)值Map,您還可以使用Map::removeKey(),傳入鍵以刪除。

要從a中刪除一個(gè)值Set,請(qǐng)使用Set::remove(),傳遞要?jiǎng)h除的集合中的值。

您不能從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,但不是Vector。Vector在移除后移動(dòng)索引,但數(shù)組不會(huì),unset()原來(lái)是用于數(shù)組。

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

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)