为什么这个 Raku 程序会生成 Seq of Array 而不是简单的 Array?

Why is this Raku program producing a Seq of Array rather than a simple Array?

提问人:Jim Bollinger 提问时间:3/18/2023 最后编辑:Jim Bollinger 更新时间:3/19/2023 访问量:161

问:

my %f;
for $*HOME.dir() -> $file {
    my $filename = $file.basename;
    %f{$filename}.push: $file, rand;
}
my $p = %f.pick; # just need any old random element
say $p.^name;
say "{$p.values.^name} has {$p.values.elems} elements";
say "{$p.values[0].^name} has {$p.values[0].elems} elements";

say '';
say $*RAKU;
say $*DISTRO;
say $*KERNEL;
say $*VM;

输出:

Pair
Seq has 1 elements
Array has 2 elements

Raku (6.d)
macos (13.2.1)
darwin
moar (2023.02)

为什么 的 是 的 ,而不是简单的?.values$pSeqArrayArray

数组 hashmap sequence push raku

评论

0赞 jubilatious1 3/18/2023
调用哈希值有意义吗?Raku 哈希值不应该是随机顺序的吗?first
1赞 Jim Bollinger 3/19/2023
你是对的。我已经编辑了这个问题,以更清楚地表明我只是在选择一个元素,并且该顺序与它无关。

答:

7赞 codesections 3/18/2023 #1

正如您的行所示,是 .此值为 ;如果你打电话,你会得到.但是(带有“s”)返回所有值的序列 - 即包含一个 。say $p.^name$pPairPairArray$p.valueArray$p.values$pSeqArray

为什么 %f 的 .values 是数组的序列

(我不确定这是不是错别字,但请注意,您调用了 的元素,而不是它本身。调用所有元素也会给你一个 s,但有更多的元素(每个条目对应一个元素。另请注意,(a ) 不是有序的,因此不会返回一致的元素——这很少是您想要的。.values.first%f%f.values%fSeqArray%f%fHash.first

评论

0赞 Jim Bollinger 3/19/2023
啊,我应该用的,不是!谢谢,很清楚。.value.values
6赞 raiph 3/18/2023 #2

为什么 的 是 的 ,而不是简单的?.values%fSeqArrayArray

首先,正如@codesections所指出的,它不是 ,而是来自(“第一个”元素,这是误导性的,但这是一个红鲱鱼)。%f%f

所以它是一个..valuesPair


文档 说:Pair.values

multi method values(Pair:D: --> List:D)

返回包含调用方值的 a。List

文档说它应该是 a(既不是 a 也不是 an)。ListSeqArray

哎呀。


main/src/core.c/Pair.pm6 中的当前方法声明为:.values

multi method values(Pair:D:) {
    Seq.new(Rakudo::Iterator.OneValue($!value))
}

所以这就是为什么你得到一个.Seq

你应该这样吗?为什么实际结果与文档不符?需要解决什么问题?


一种可能性是文档一直都是错误的。Git blame 显示它是在 2016 年年中编写的。文档曾经是对的,但 Rakudo 改变了吗?

我加入了自助式 IRC 机器人频道(使用 kiwiirc),然后输入:#whateverable

c: say (:a).values ~~ List

它运行了 commitable6,这是 Raku IRC 机器人系列之一,以测试在 Rakudo 编译器版本上运行该代码的结果。

几分钟后,我收到了一份报告,显示乐道确实返回了一个列表——直到 2017.08

2017.08发生了什么?


main/src/core.c/Pair.pm6 的 git blame 报告显示了一个 Liz 提交

简化 Pair 上的标准 Seq 方法

  • 添加专用 .iterator
  • 确保 .keys/kv/values/pairs/antipairs 生成 Seq 而不是 List,就像它们在任何其他对象上所做的那样。

所以这就是为什么 Rakudo 更改以返回 .Pair.valuesSeq

我刚刚检查了一下,文档也是错误的,我认为最好假设 .keys/kv/values/pairs/antipairs 的文档也是错误的。Pairs.kv


我希望在本周末写下我的结论,但会公布我目前所拥有的。

评论

0赞 Jim Bollinger 3/19/2023
这是否意味着调用 a 将始终返回只有一个元素的 a?.valuesPairSeq
0赞 raiph 3/19/2023
🅐 2022 年乐道的产量。🅑 我认为相关代码看起来可以确保只包含一个元素。🅒 在我看来,最合适的烘焙测试只测试值为标量(单数)的一对,而不是值为非标量(复数)的一对。🅓 我还没有得出任何结论。say :a<a b c>.values.elems1Seq