定义一个结my $j = 1 | 2 | 3 | 4 | 5
,现在我想获得一个值为[1 2 3 4 5]
的数组,我该如何实现这个?如何以数组的形式返回结点中的值?
我试过$j.values
但Perl6给了我整个连接点作为一个元素:[any((1), (2), (3), (4), (5))]
。
定义一个结my $j = 1 | 2 | 3 | 4 | 5
,现在我想获得一个值为[1 2 3 4 5]
的数组,我该如何实现这个?如何以数组的形式返回结点中的值?
我试过$j.values
但Perl6给了我整个连接点作为一个元素:[any((1), (2), (3), (4), (5))]
。
由于哈康Hægland已经指出的那样,这是不是你应该做的事:
结意味着被用作布尔上下文匹配器;不支持路口的反省。如果你觉得反省交界处的冲动,请改用Set或相关类型。
然而,这是可能的。
首先,可以使用authothreading(即,当传递到预计Any
类型的参数的函数的结的每个分支的自动评估):
sub unjunc(Junction $j) {
gather -> Any $_ { .take }.($j);
}
其次,可以捅到胆并手动提取值:如果您的交界处非递归
sub unjunc(Junction $j) {
multi extract(Any $_) { .take }
multi extract(Junction $_) {
use nqp;
my $list := nqp::getattr($_, Junction, '$!storage');
my int $elems = nqp::elems($list);
loop (my int $i = 0; $i < $elems; $i = $i + 1) {
extract nqp::atpos($list, $i);
}
}
gather extract $j;
}
(即不包含要弄平其他路口),后一种方法可以简化为:
my $j := 1|2|3;
say nqp::p6bindattrinvres(nqp::create(List), List, '$!reified',
nqp::getattr($j, Junction, '$!storage'));
据我所知,这是故意的。假设$ j包含哈希交点:然后$ j.values将是Seq的交点,而不是哈希本身。
如果你想结的阵列,那么也许你应该从一个数组开始,建设结出的是:
my @a = 1,2,3,4,5;
my $j = any(@a);
如果你真的想去的路口 - >阵方式,你可以,但它会涉及到使用nqp,这是我不建议在用户级代码。
这可以进一步简化: 'my $ j = any my @a = 1,2,3,4,5;' – ab5tract
根据[文档](https://docs.perl6.org/type/Junction):*“连接是用作布尔上下文中的匹配器;不支持内部连接。如果您觉得“* –