为何该Raku程序生成Seq包裹的Array而非单纯的Array?
关于Raku中Pair.values返回Seq而非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)
疑问
为何$p的.values是包含Array的Seq类型,而非单纯的Array类型?
解答
这是Raku为保持接口一致性做出的设计:
- Pair被设计成和哈希(Hash)接口对齐的类型——哈希的
.values方法返回所有值组成的Seq(惰性序列),Pair作为单个键值对的“迷你哈希”,它的.values也会返回包含单个值的Seq,而不是直接返回值本身。 - 你的代码里,
%f的每个值都是Array(因为对哈希条目调用.push时,Raku会自动把初始的标量值升级为Array)。所以$p.value能直接拿到那个Array,但$p.values会把这个Array包裹进Seq里,因此它的元素数是1,取索引0才能获取到原本的Array对象。
内容的提问来源于stack exchange,提问作者Jim Bollinger
相关产品推荐
相关产品推荐

