You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何该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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 18:37:41