W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗(yàn)值獎勵
您通常將通過具體類實(shí)例化Hack集合對象。但是,什么參數(shù)類型被接受或從方法返回可能是其中一個接口。
以下示例顯示如何將任何具體的類傳遞給需要的函數(shù)Iterable<T>。在這些情況下T,代表每個集合的值的類型。所以int對于$v和string為$m。對于地圖,在這種情況下,鍵的類型并不重要。
<?hh
namespace Hack\UserDocumentation\Collections\Typing\Examples\Iter;
// Given that this function takes an Iterable, you can pass any of
// our current concerte collection classes to this method
function take_iterable<T>(Iterable<T> $it): array<T> {
return $it->toValuesArray();
}
function run(): void {
$v = Vector {100, 200, 300};
var_dump(take_iterable($v));
$iv = ImmVector {400, 500, 600};
var_dump(take_iterable($iv));
$s = Set {'A', 'B'};
var_dump(take_iterable($s));
$is = ImmSet {'C', 'D'};
var_dump(take_iterable($is));
$m = Map {'A' => 'Z', 'B' => 'Y'};
var_dump(take_iterable($m));
$im = ImmMap {'C' => 'X', 'D' => 'W'};
var_dump(take_iterable($im));
}
run();
Output
array(3) {
[0]=>
int(100)
[1]=>
int(200)
[2]=>
int(300)
}
array(3) {
[0]=>
int(400)
[1]=>
int(500)
[2]=>
int(600)
}
array(2) {
[0]=>
string(1) "A"
[1]=>
string(1) "B"
}
array(2) {
[0]=>
string(1) "C"
[1]=>
string(1) "D"
}
array(2) {
[0]=>
string(1) "Z"
[1]=>
string(1) "Y"
}
array(2) {
[0]=>
string(1) "X"
[1]=>
string(1) "W"
}
以下示例顯示了如何使用它ConstVector來確保傳遞不能修改的向量。你可能會問為什么不注釋它ImmVector?那是因?yàn)槟憧梢韵胂笪磥韺?shí)施的其他不變的向量 并且由于所有不可變的向量必須實(shí)現(xiàn)ConstVector,所以更具有表現(xiàn)力ConstVector。返回類型也采用相同的理由MutableVector。
現(xiàn)在,如果你知道這個函數(shù)只會占用一個ImmVector現(xiàn)在和永遠(yuǎn),那么鍵入注釋ImmVector就可以了。
<?hh
namespace Hack\UserDocumentation\Collections\Typing\Examples\CV;
// Given that this function takes a ConstVector, you can pass any concrete
// collection that implements the interface (currently Vector and ImmVector)
function filter_vec(\ConstVector<int> $cv): \MutableVector<int> {
try {
$cv[] = 900; // cannot modify a ConstVector
} catch (\InvalidOperationException $ex) {
var_dump($ex->getMessage());
}
$mv = $cv->filter($x ==> $x % 4 === 0);
return $mv->toVector();
}
function run(): void {
$iv = ImmVector {100, 125, 150, 175};
var_dump(filter_vec($iv));
}
run();
Output
string(51) "Cannot modify immutable object of type HH\ImmVector"
object(HH\Vector)#5 (1) {
[0]=>
int(100)
}
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: