class Stash is Hash { }

Stash 是一个哈希,用于 Raku 中包作用域级别的符号表。

要获取 Stash,可以在包上调用 .WHO 伪方法(因为它回答了问题谁住在这里?),或者如果你将包名写成一个字面量,则附加两个冒号

class Boring {
    class Nested { };
    our sub package_sub { }
    my sub lexical { };
    method a_method() { }
}
say Boring::.^name;             # OUTPUT: «Stash␤» 
say Boring.WHO === Boring::;    # OUTPUT: «True␤»

由于它继承自 Hash,因此你可以使用所有通常的哈希功能

say Boring::.keys.sort;         # OUTPUT: «(&package_sub Nested)␤» 
say Boring::<Nested>;           # OUTPUT: «(Nested)␤» 

如上例所示,只有“our”作用域的东西出现在 Stash 中(嵌套类默认情况下是“our”,但可以用“my”排除。)词法和方法不包含在 Stash 中,因为它们不位于包表中。词法存在于一个单独的词法 pad 中,该 pad 仅在作用域内部可见。方法(如果包也是一个类)有一个单独的方法表,并且可以通过对类本身进行内省来访问,通过 .can.^methods

类型图§

Stash 的类型关系
raku-type-graph Stash Stash Hash Hash Stash->Hash Mu Mu Any Any Any->Mu Cool Cool Cool->Any Iterable Iterable Associative Associative Map Map Map->Cool Map->Iterable Map->Associative Hash->Map

展开上面的图表