如何在黑客中访问可选的形状字段?



举个例子,假设我有一个以下形状的类型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方法。

但您也可以使用 null coalesce 运算符,您可能更熟悉其他编程语言(如 PHP 和 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;

相关内容

  • 没有找到相关文章

最新更新