如何访问 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;
举个例子,假设我有一个类型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;