如何在没有伴随装箱(即分项)的情况下为 Hash 键分配值?

jjm*_*elo 9 syntax raku

来自这个 SO question,我试图将一个List(或非标量的东西,一般来说)作为分配给哈希键的值,这样:

my %syns-by-name does Associative[Str,List] = Bq => ("Bq", "becquerel", "becquerels");
my Str  @syns = %syns-by-name<Bq>;
Run Code Online (Sandbox Code Playgroud)

然而,这是行不通的。列表在分配之前逐项列出,因此值始终是标量。您需要采取一种解决方法来实际完成这项工作:

my %syns-by-name does Associative[Str,List] = Bq => ("Bq", "becquerel", "becquerels");

my @list := <C coulomb coulombs>;
%syns-by-name<C> := @list;

my Str  @syns = %syns-by-name<C>;
say @syns;
Run Code Online (Sandbox Code Playgroud)

这将返回我们正在寻找的内容,一个列表。但是,我们怎么能直接在作业上做到这一点并说服一个列表是一个列表而不是一个逐项列表呢?

Jon*_*ton 10

假设您之后不需要突变,请使用 aMap而不是 a Hash

my %syns-by-name is Map = Bq => ("Bq", "becquerel", "becquerels");
my Str @syns = %syns-by-name<Bq>;
say @syns; # [Bq becquerel becquerels]
Run Code Online (Sandbox Code Playgroud)

由于不期望 a 中的条目Map是可分配的,因此它不会Scalar为值创建容器。


Eli*_*sen 8

怎么样:

role deconting {
    method AT-KEY(\key) {
        callsame<>
    }
}
my %h does deconting = a => <a b c>;
dd $_ for %h<a>;  # "a"?"b"?"c"?
Run Code Online (Sandbox Code Playgroud)

这确保了执行“解构”角色的散列将始终返回散列解容器中的任何内容。

也可以在赋值时对其进行去容器化,但要复​​杂得多,因为这需要调整至少两种方法:STOREASSIGN-KEY.