hack枚舉函數(shù)

2018-11-08 17:51 更新

枚舉類型是標(biāo)量類型的,但是它們?cè)谝恍┓矫嫦駥?duì)象一樣。首先,它們是名稱空間的。其次,像訪問類常量一樣訪問枚舉成員的值。第三,每個(gè)枚舉有6個(gè)靜態(tài)函數(shù)可用。

assert()

assert()需要一個(gè)值,試圖將其轉(zhuǎn)換為底層的枚舉類型。如果可以,則返回鑄造值(例如,枚舉名稱的類型); 否則會(huì)拋出一個(gè)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)

這個(gè)例子展示了如何用assert()Day枚舉成員的值給定它的基礎(chǔ)類型的值int。由于有一個(gè)檢查,確保所提供的int是在適當(dāng)?shù)姆秶鷥?nèi),我們可以確信,我們不會(huì)得到一個(gè)運(yùn)行時(shí)異常使用枚舉中不存在的值。

assertAll()

assertAll()需要一個(gè)值的容器,試圖將每個(gè)值轉(zhuǎn)換為基礎(chǔ)的枚舉類型。如果它可以為所有的值,它返回一個(gè)casted值的容器; 否則會(huì)拋出一個(gè)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)

這個(gè)例子展示了如何assertAll()使用Day枚舉成員的值來獲取Vector它的基礎(chǔ)類型int。由于有一個(gè)檢查,確保所提供的ints在Vector適當(dāng)?shù)姆秶鷥?nèi),我們可以確信,我們將不會(huì)得到一個(gè)運(yùn)行時(shí)異常使用枚舉中不存在的值。

請(qǐng)注意,assertAll()返回一個(gè)Container(這是一個(gè)孩子Traversable,所以為了我們需要?jiǎng)?chuàng)建一個(gè)新Vector的,Container并傳遞給它get_latest_day()。

coerce()

與類似assert(),但不是拋出一個(gè)異常,當(dāng)轉(zhuǎn)換不能發(fā)生時(shí),它返回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)

這個(gè)例子展示了如何用coerce()Day枚舉成員的值給定它的基礎(chǔ)類型的值int。既然coerce()返回,null如果給定int不是枚舉的成員值Day,我們只是返回null,get_next_day_int()如果它不能被發(fā)現(xiàn)。

getNames()

getNames()返回一個(gè)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)

這個(gè)例子顯示了如何使用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)
}

這個(gè)例子簡(jiǎn)單地顯示了getValues()在Dayenum 上輸出的格式。

isValid()

isValid取值并返回一個(gè)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)

這個(gè)例子展示了如何isValid()用來確定一個(gè)給定的Day枚舉類型的基礎(chǔ)值(在本例中int)是否是一個(gè)成員值Day。

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)