hack枚举函数

2018-11-08 17:51 更新

枚举类型是标量类型的,但是它们在一些方面像对象一样。首先,它们是名称空间的。其次,像访问类常量一样访问枚举成员的值。第三,每个枚举有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。

以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号