hack集合:Read Write
像数组一样,您可以使用方括号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)
Set
s没有键,所以使用方括号语法进行阅读有一点奇怪,虽然可以在运行时执行。然而,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"
检索功能
除了使用方括号语法[]从集合中获取值,则对方法Vector,Map并Pair 以给定一个键,得到的值。由于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()
上Map
和Set
,但不是Vector
。Vector
在移除后移动索引,但数组不会,unset()
原来是用于数组。