如何访问 hack 中的可选形状字段?

How to access optional shape field in hack?

举个例子,假设我有一个类型foo,形状如下,

type foo = shape(
  ?'bar' => float,
  ...
);

现在,如果我尝试按以下方式访问字段 bar 的值,

do_something_with($rcvd['bar']);

其中 $rcvd 属于 foo 类型,它不起作用,因为 bar 是一个可选成员,对于实例 $rcvd 可能不存在。 因此,对于这个给定的示例,问题是 - 如何访问 $rcvd 的成员 bar?

好的,找到了:https://docs.hhvm.com/hack/reference/class/HH.Shapes/idx/

所以正确的方法是,

Shapes::idx($rcvd, 'bar');

您可以使用您在回答中提到的 Shapes::idx 方法。

但您也可以使用空合并运算符,您可能更熟悉其他编程语言,例如 PHP and C#

参见:https://docs.hhvm.com/hack/expressions-and-operators/coalesce

示例:

type Foo = shape(
  'bar' => ?int,
  ?'baz' => int,
);

function qux(Foo $foo): int {
  $default = 1;
  // foo[bar] is null ? set default.
  $bar = $foo['bar'] ?? $default;
  // foo[baz] doesn't exist ? set default.
  $baz = $foo['baz'] ?? $default;
  return $baz + $bar;
}

<<__EntryPoint>>
async function main(): Awaitable<noreturn> {
  echo qux(shape(
    'bar' => null,
  )); // 2
  echo qux(shape(
    'bar' => 0,
  )); // 1
  echo qux(shape(
    'bar' => 1,
  )); // 2
  echo qux(shape(
    'bar' => 4,
    'baz' => 2,
  )); // 6
  echo qux(shape(
    'bar' => null,
    'baz' => 0
  )); // 1
}

Hack 还支持空合并相等运算符。

示例:

// foo[bar] is null ? set foo[bar] to default
$foo['bar'] ??= $default;

// foo[baz] is missing ? set foo[baz] to default
$foo['baz'] ??= $default;