W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
像數(shù)組一樣,您可以使用方括號(hào)syntax([])來(lái)從Hack集合讀取和寫入。
從集合中讀取幾種方法。您可以使用[],調(diào)用類似的方法Set::contains()和Vector::containsKey()或喜歡使用的功能isset()和empty()。
您可以使用方括號(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)
Set
s沒(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,Map并Pair 以給定一個(gè)鍵,得到的值。由于a Set沒(méi)有鍵,這些方法不適用。
要想測(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()與哈克收藏為好。
您可以使用空的方式將值附加到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()
上Map
和Set
,但不是Vector
。Vector
在移除后移動(dòng)索引,但數(shù)組不會(huì),unset()
原來(lái)是用于數(shù)組。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: