hack枚举函数
枚举类型是标量类型的,但是它们在一些方面像对象一样。首先,它们是名称空间的。其次,像访问类常量一样访问枚举成员的值。第三,每个枚举有6个静态函数可用。
assert()
assert()需要一个值,试图将其转换为底层的枚举类型。如果可以,则返回铸造值(例如,枚举名称的类型); 否则会抛出一个UnexpectedValueException。
<?hh
namespace Hack\UserDocumentation\API\Enums\AssertFunc;
enum Day: int {
SUNDAY = 1;
MONDAY = 2;
TUESDAY = 3;
WEDNESDAY = 4;
THURSDAY = 5;
FRIDAY = 6;
SATURDAY = 7;
}
class MyCalendar {
public static function get_next_day_int(int $day): Day {
if ($day > 0 && $day < 8) {
// We know that $day is in the enum value range, so we can assert that
// we are converting to one that exists.
return self::get_next_day(Day::assert($day));
}
return Day::SUNDAY;
}
public static function get_next_day(Day $day): Day {
// assert here two since we want to cast to add the days
return $day !== Day::SATURDAY ? Day::assert((int) $day + 1) : Day::SUNDAY;
}
}
var_dump(MyCalendar::get_next_day_int(4)); // int(5)
var_dump(MyCalendar::get_next_day(Day::SATURDAY)); // int(1)
Output
int(5)
int(1)
这个例子展示了如何用assert()Day枚举成员的值给定它的基础类型的值int。由于有一个检查,确保所提供的int是在适当的范围内,我们可以确信,我们不会得到一个运行时异常使用枚举中不存在的值。
assertAll()
assertAll()需要一个值的容器,试图将每个值转换为基础的枚举类型。如果它可以为所有的值,它返回一个casted值的容器; 否则会抛出一个UnexpectedValueException。
<?hh
namespace Hack\UserDocumentation\API\Enums\AssertAllFunc;
enum Day: int {
SUNDAY = 1;
MONDAY = 2;
TUESDAY = 3;
WEDNESDAY = 4;
THURSDAY = 5;
FRIDAY = 6;
SATURDAY = 7;
}
class MyCalendar {
public static function get_latest_day_int(Vector<int> $days): Day {
if (min($days) > 0 && max($days) < 8) {
// We know that all values in $days are in the enum value range,
// so we can assert that we are converting to one that exists.
// assertAll returns a Container, so make sure to create a new
// Vector from it.
return self::get_latest_day(new Vector(Day::assertAll($days)));
}
return Day::SUNDAY;
}
public static function get_latest_day(Vector<Day> $days): Day {
return max($days);
}
}
var_dump(MyCalendar::get_latest_day_int(Vector {4, 6, 3})); // int(6)
var_dump(MyCalendar::get_latest_day(
Vector {Day::WEDNESDAY, Day::SATURDAY})
); // int(7)
Output
int(6)
int(7)
这个例子展示了如何assertAll()使用Day枚举成员的值来获取Vector它的基础类型int。由于有一个检查,确保所提供的ints在Vector适当的范围内,我们可以确信,我们将不会得到一个运行时异常使用枚举中不存在的值。
请注意,assertAll()返回一个Container(这是一个孩子Traversable,所以为了我们需要创建一个新Vector的,Container并传递给它get_latest_day()。
coerce()
与类似assert(),但不是抛出一个异常,当转换不能发生时,它返回null。
<?hh
namespace Hack\UserDocumentation\API\Enums\Coerce;
enum Day: int {
SUNDAY = 1;
MONDAY = 2;
TUESDAY = 3;
WEDNESDAY = 4;
THURSDAY = 5;
FRIDAY = 6;
SATURDAY = 7;
}
class MyCalendar {
public static function get_next_day_int(int $day): ?Day {
// coerce will return null if the underlying type value isn't an enum
// member value
$coerced = Day::coerce($day);
return $coerced ? self::get_next_day($coerced) : null;
}
public static function get_next_day(Day $day): ?Day {
// assert here two since we want to cast to add the days
return $day !== Day::SATURDAY ? Day::assert((int) $day + 1) : Day::SUNDAY;
}
}
var_dump(MyCalendar::get_next_day_int(4)); // int(5)
var_dump(MyCalendar::get_next_day(Day::SATURDAY)); // int(1)
Output
int(5)
int(1)
这个例子展示了如何用coerce()Day枚举成员的值给定它的基础类型的值int。既然coerce()返回,null如果给定int不是枚举的成员值Day,我们只是返回null,get_next_day_int()如果它不能被发现。
getNames()
getNames()返回一个array映射的枚举成员值到他们的名字。InvariantException如果枚举值不唯一,则抛出An 。
<?hh
namespace Hack\UserDocumentation\API\Enums\GetNames;
enum Day: int {
SUNDAY = 1;
MONDAY = 2;
TUESDAY = 3;
WEDNESDAY = 4;
THURSDAY = 5;
FRIDAY = 6;
SATURDAY = 7;
}
function check_name(string $name): bool {
return in_array($name, Day::getNames());
}
var_dump(check_name("SUNDAY")); // bool(true)
var_dump(check_name("NOPE")); // bool(false)
/*
Day::getNames() returns this:
array(7) {
[1]=>
string(6) "SUNDAY"
[2]=>
string(6) "MONDAY"
[3]=>
string(7) "TUESDAY"
[4]=>
string(9) "WEDNESDAY"
[5]=>
string(8) "THURSDAY"
[6]=>
string(6) "FRIDAY"
[7]=>
string(8) "SATURDAY"
}
*/
Output
bool(true)
bool(false)
这个例子显示了如何使用getNames()获取Day枚举的名字(例如,“SUNDAY”),并检查array提供的名称以确定是否存在。
getValues()
getValues()返回array枚举成员名称到它们的值的映射。
<?hh
namespace Hack\UserDocumentation\API\Enums\GetValues;
enum Day: int {
SUNDAY = 1;
MONDAY = 2;
TUESDAY = 3;
WEDNESDAY = 4;
THURSDAY = 5;
FRIDAY = 6;
SATURDAY = 7;
}
var_dump(Day::getValues());
/*
Day::getValues() returns this:
array(7) {
["SUNDAY"]=>
int(1)
["MONDAY"]=>
int(2)
["TUESDAY"]=>
int(3)
["WEDNESDAY"]=>
int(4)
["THURSDAY"]=>
int(5)
["FRIDAY"]=>
int(6)
["SATURDAY"]=>
int(7)
}
*/
Output
array(7) {
["SUNDAY"]=>
int(1)
["MONDAY"]=>
int(2)
["TUESDAY"]=>
int(3)
["WEDNESDAY"]=>
int(4)
["THURSDAY"]=>
int(5)
["FRIDAY"]=>
int(6)
["SATURDAY"]=>
int(7)
}
这个例子简单地显示了getValues()在Dayenum 上输出的格式。
isValid()
isValid取值并返回一个bool取决于该值是否存在于枚举中。
<?hh
namespace Hack\UserDocumentation\API\Enums\isValid;
enum Day: int {
SUNDAY = 1;
MONDAY = 2;
TUESDAY = 3;
WEDNESDAY = 4;
THURSDAY = 5;
FRIDAY = 6;
SATURDAY = 7;
}
function check_value(int $value): bool {
return Day::isValid($value);
}
var_dump(check_value(3)); // bool(true)
var_dump(check_value(9)); // bool(false)
Output
bool(true)
bool(false)
这个例子展示了如何isValid()用来确定一个给定的Day枚举类型的基础值(在本例中int)是否是一个成员值Day。