定义一个联结my $j = 1 | 2 | 3 | 4 | 5
,现在我想得到一个值为[1 2 3 4 5]
的数组,我该如何实现呢?
我尝试$j.values
,但Perl6给了我整个交叉点作为元素:[any((1), (2), (3), (4), (5))]
。
答案 0 :(得分:9)
据我所知,这是故意的。
想象一下$ j包含一个哈希的连接点:然后$ j.values将是Seq' s的连接点,不是哈希值。
如果你想要一个联结的数组,那么也许你应该从一个数组开始,并构建一个结点:
\
如果真的想要去交界处 - >数组方式,你可以,但它将涉及使用nqp,这是我不建议用户代码中的东西。
答案 1 :(得分:6)
正如HåkonHægland已经指出的那样,这不是你应该做的事情:
Junctions用作布尔上下文中的匹配器;不支持对结点的内省。如果您想要反省联结,请改用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'));