如何在不伴随装箱(即分项)的情况下为哈希键赋值?
How can you assign values to a Hash key without concomitant boxing (i.e. itemization)?
来自 ,我试图将 List
(或非标量的东西,通常)作为分配给哈希键的值,这样:
my %syns-by-name does Associative[Str,List] = Bq => ("Bq", "becquerel", "becquerels");
my Str @syns = %syns-by-name<Bq>;
然而,这不起作用。列表在分配之前逐项列出,因此值始终是标量。您需要采取变通办法才能实际完成这项工作:
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;
这 returns 我们要找的东西,一个列表。但是,我们如何才能直接在作业上做到这一点并说服列表是列表而不是逐项列表?
怎么样:
role deconting {
method AT-KEY(\key) {
callsame<>
}
}
my %h does deconting = a => <a b c>;
dd $_ for %h<a>; # "a""b""c"
这确保了执行“去容器化”角色的哈希将始终return去容器化哈希中的任何内容。
也可以在分配时对其进行去容器化,但要棘手得多,因为这至少需要调整两种方法:STORE
和 ASSIGN-KEY
.
假设您之后不需要突变,请使用 Map
而不是 Hash
。
my %syns-by-name is Map = Bq => ("Bq", "becquerel", "becquerels");
my Str @syns = %syns-by-name<Bq>;
say @syns; # [Bq becquerel becquerels]
由于不期望 Map
中的条目是可分配的,因此它不会为值创建 Scalar
容器。
尽管@Jonathan_Worthington 和@Elizabeth_Mattijsen 给出了很好的答案,但我还是想post 下面的代码,它利用了简单的去容器化:
~$ raku
Welcome to ™ v2020.10.
Implementing the ™ programming language v6.d.
Built on MoarVM version 2020.10.
To exit type 'exit' or '^D'
> my %syns-by-name = Bq => ("Bq", "becquerel", "becquerels");
{Bq => (Bq becquerel becquerels)}
> my Str @syns = %syns-by-name<Bq>;
Type check failed in assignment to @syns; expected Str but got List (("Bq", "becquerel", ...)
in block <unit> at <unknown file> line 1
> my Str @syns = %syns-by-name<Bq>[];
[Bq becquerel becquerels]
>
我发现这里有一个学术问题,即变量是如何 定义的 与变量的值是如何被 访问的 。但是,我不想随便 reader 得出结论说 Raku 缺乏相对于哈希和列表的功能。
> my %syns-by-name = Bq => ("Bq", "becquerel", "becquerels");
{Bq => (Bq becquerel becquerels)}
> dd $_ for %syns-by-name<Bq>[]
"Bq"
"becquerel"
"becquerels"
Nil
> my $list = <C coulomb coulombs>;
(C coulomb coulombs)
> say $list.WHAT
(List)
> %syns-by-name<C> = $list
(C coulomb coulombs)
> dd $_ for %syns-by-name<C>[]
"C"
"coulomb"
"coulombs"
Nil
>
我希望这个回答不是多余的,不经意的 reader 会受益。谢谢。
来自 List
(或非标量的东西,通常)作为分配给哈希键的值,这样:
my %syns-by-name does Associative[Str,List] = Bq => ("Bq", "becquerel", "becquerels");
my Str @syns = %syns-by-name<Bq>;
然而,这不起作用。列表在分配之前逐项列出,因此值始终是标量。您需要采取变通办法才能实际完成这项工作:
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;
这 returns 我们要找的东西,一个列表。但是,我们如何才能直接在作业上做到这一点并说服列表是列表而不是逐项列表?
怎么样:
role deconting {
method AT-KEY(\key) {
callsame<>
}
}
my %h does deconting = a => <a b c>;
dd $_ for %h<a>; # "a""b""c"
这确保了执行“去容器化”角色的哈希将始终return去容器化哈希中的任何内容。
也可以在分配时对其进行去容器化,但要棘手得多,因为这至少需要调整两种方法:STORE
和 ASSIGN-KEY
.
假设您之后不需要突变,请使用 Map
而不是 Hash
。
my %syns-by-name is Map = Bq => ("Bq", "becquerel", "becquerels");
my Str @syns = %syns-by-name<Bq>;
say @syns; # [Bq becquerel becquerels]
由于不期望 Map
中的条目是可分配的,因此它不会为值创建 Scalar
容器。
尽管@Jonathan_Worthington 和@Elizabeth_Mattijsen 给出了很好的答案,但我还是想post 下面的代码,它利用了简单的去容器化:
~$ raku
Welcome to ™ v2020.10.
Implementing the ™ programming language v6.d.
Built on MoarVM version 2020.10.
To exit type 'exit' or '^D'
> my %syns-by-name = Bq => ("Bq", "becquerel", "becquerels");
{Bq => (Bq becquerel becquerels)}
> my Str @syns = %syns-by-name<Bq>;
Type check failed in assignment to @syns; expected Str but got List (("Bq", "becquerel", ...)
in block <unit> at <unknown file> line 1
> my Str @syns = %syns-by-name<Bq>[];
[Bq becquerel becquerels]
>
我发现这里有一个学术问题,即变量是如何 定义的 与变量的值是如何被 访问的 。但是,我不想随便 reader 得出结论说 Raku 缺乏相对于哈希和列表的功能。
> my %syns-by-name = Bq => ("Bq", "becquerel", "becquerels");
{Bq => (Bq becquerel becquerels)}
> dd $_ for %syns-by-name<Bq>[]
"Bq"
"becquerel"
"becquerels"
Nil
> my $list = <C coulomb coulombs>;
(C coulomb coulombs)
> say $list.WHAT
(List)
> %syns-by-name<C> = $list
(C coulomb coulombs)
> dd $_ for %syns-by-name<C>[]
"C"
"coulomb"
"coulombs"
Nil
>
我希望这个回答不是多余的,不经意的 reader 会受益。谢谢。