提问人:Jim Bollinger 提问时间:3/18/2023 最后编辑:Jim Bollinger 更新时间:3/19/2023 访问量:161
为什么这个 Raku 程序会生成 Seq of Array 而不是简单的 Array?
Why is this Raku program producing a Seq of Array rather than a simple Array?
问:
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
$p
Seq
Array
Array
答:
正如您的行所示,是 .此值为 ;如果你打电话,你会得到.但是(带有“s”)返回所有值的序列 - 即包含一个 。say $p.^name
$p
Pair
Pair
Array
$p.value
Array
$p.values
$p
Seq
Array
为什么 %f 的 .values 是数组的序列
(我不确定这是不是错别字,但请注意,您调用了 的元素,而不是它本身。调用所有元素也会给你一个 s,但有更多的元素(每个条目对应一个元素。另请注意,(a ) 不是有序的,因此不会返回一致的元素——这很少是您想要的。.values
.first
%f
%f
.values
%f
Seq
Array
%f
%f
Hash
.first
评论
.value
.values
为什么 的 是 的 ,而不是简单的?
.values
%f
Seq
Array
Array
首先,正如@codesections所指出的,它不是 ,而是来自(“第一个”元素,这是误导性的,但这是一个红鲱鱼)。%f
%f
所以它是一个..values
Pair
文档 说:Pair.values
multi method values(Pair:D: --> List:D)
返回包含调用方值的 a。
List
文档说它应该是 a(既不是 a 也不是 an)。List
Seq
Array
哎呀。
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.values
Seq
我刚刚检查了一下,文档也是错误的,我认为最好假设 .keys/kv/values/pairs/antipairs 的文档也是错误的。Pairs.kv
我希望在本周末写下我的结论,但会公布我目前所拥有的。
评论
.values
Pair
Seq
say :a<a b c>.values.elems
1
Seq
上一个:Excel 序列一组值
评论
first