2017-04-23 57 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

相關問題