2017-04-23 59 views
8

定义一个结my $j = 1 | 2 | 3 | 4 | 5,现在我想获得一个值为[1 2 3 4 5]的数组,我该如何实现这个?如何以数组的形式返回结点中的值?

我试过$j.values但Perl6给了我整个连接点作为一个元素:[any((1), (2), (3), (4), (5))]

+2

根据[文档](https://docs.perl6.org/type/Junction):*“连接是用作布尔上下文中的匹配器;不支持内部连接。如果您觉得“* –

回答

6

由于哈康Hægland已经指出的那样,这是不是你应该做的事:

结意味着被用作布尔上下文匹配器;不支持路口的反省。如果你觉得反省交界处的冲动,请改用Set或相关类型。

  - docs.perl6.org/type/Junction

然而,这是可能的。

首先,可以使用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')); 
9

据我所知,这是故意的。假设$ j包含哈希交点:然后$ j.values将是Seq的交点,而不是哈希本身。

如果你想结的阵列,那么也许你应该从一个数组开始,建设结出的是:

my @a = 1,2,3,4,5; 
my $j = any(@a); 

如果你真的想去的路口 - >阵方式,你可以,但它会涉及到使用nqp,这是我不建议在用户级代码。

+0

这可以进一步简化: 'my $ j = any my @a = 1,2,3,4,5;' – ab5tract

相关问题