如何将结点中的值 return 作为数组?
How to return the values in a junction as an array?
定义一个结点my $j = 1 | 2 | 3 | 4 | 5
,现在我想得到它的值[1 2 3 4 5]
的数组,我该如何实现?
我试过 $j.values
但 Perl6 给了我整个联结作为一个元素:[any((1), (2), (3), (4), (5))]
.
正如 Håkon Hægland 已经指出的,这不是您应该做的事情:
Junctions are meant to be used as matchers in boolean context; introspection of junctions is not supported. If you feel the urge to introspect a junction, use a Set or a related type instead.
但是,这是可能的。
首先,您可以使用 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);
如果您真的想要采用 Junction -> Array 方式,您可以,但它会涉及使用 nqp,这是我在用户态代码中不推荐的东西。
定义一个结点my $j = 1 | 2 | 3 | 4 | 5
,现在我想得到它的值[1 2 3 4 5]
的数组,我该如何实现?
我试过 $j.values
但 Perl6 给了我整个联结作为一个元素:[any((1), (2), (3), (4), (5))]
.
正如 Håkon Hægland 已经指出的,这不是您应该做的事情:
Junctions are meant to be used as matchers in boolean context; introspection of junctions is not supported. If you feel the urge to introspect a junction, use a Set or a related type instead.
但是,这是可能的。
首先,您可以使用 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);
如果您真的想要采用 Junction -> Array 方式,您可以,但它会涉及使用 nqp,这是我在用户态代码中不推荐的东西。