如何将联结中的值作为数组返回?

hwd*_*ing 8 arrays perl6 junction

定义一个联结my $j = 1 | 2 | 3 | 4 | 5,现在我想获得它的值数组[1 2 3 4 5],我应该如何实现呢?

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

Eli*_*sen 9

据我所知,这是故意的.

想象一下$ j包含一个哈希结:然后$ j.values将是Seq的交汇点,而不是哈希本身.

如果你想要一个联结的数组,那么也许你应该从一个数组开始,并构建一个结点:

my @a = 1,2,3,4,5;
my $j = any(@a);
Run Code Online (Sandbox Code Playgroud)

如果你真的想要使用Junction - > Array方式,你可以,但它会涉及使用nqp,这是我不建议用户态代码.


Chr*_*oph 6

正如HåkonHægland已经指出的那样,这不是你应该做的事情:

连接意味着在布尔上下文中用作匹配器; 不支持对结点的内省.如果您有内省结点的冲动,请改用Set或相关类型.

 - docs.perl6.org/type/Junction

但是,这是可能的.

首先,您可以使用authothreading(即在传递给期望类型参数的函数时自动评估结点的每个分支Any):

sub unjunc(Junction $j) {
    gather -> Any $_ { .take }.($j);
}
Run Code Online (Sandbox Code Playgroud)

其次,你可以钻进胆量并手动提取值:

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;
}
Run Code Online (Sandbox Code Playgroud)

如果你的联结是非递归的(即不包含你想要展平的其他联结),后一种方法可以简化:

my $j := 1|2|3;
say nqp::p6bindattrinvres(nqp::create(List), List, '$!reified',
    nqp::getattr($j, Junction, '$!storage'));
Run Code Online (Sandbox Code Playgroud)