Sorting 哈希对排序
Sorting 哈希对排序,sorting,hashmap,raku,Sorting,Hashmap,Raku,%hash.sort({.key})>.kv是否等同于上述排序 为什么在没有hyper>>提示的情况下此排序不起作用?该方法将返回一个of 因为调用列表会返回一个索引列表,所以对列表进行配对,这是您不想要的;你不能只是打电话。因此,您必须通过对每个对象调用.kv方法,分别从列表中的对象中取出键和值,而>.kv就是这样做的 你也可以用它来代替 >.kv语法允许实现将工作分散到多个线程上(如果这样做有意义)。 (目前Rakudo只是以半随机的顺序进行工作,以防止人们错误地使用该功能) 还有一种编写
%hash.sort({.key})>.kv
是否等同于上述排序
为什么在没有hyper>>
提示的情况下此排序不起作用?该方法将返回一个of
因为调用列表会返回一个索引列表,所以对列表进行配对,这是您不想要的;你不能只是打电话。因此,您必须通过对每个对象调用.kv
方法,分别从列表中的对象中取出键和值,而>.kv
就是这样做的
你也可以用它来代替
>.kv
语法允许实现将工作分散到多个线程上(如果这样做有意义)。
(目前Rakudo只是以半随机的顺序进行工作,以防止人们错误地使用该功能)
还有一种编写循环的替代方法,即使用子签名中的副词提取属性:
%hash.sort->(:$key,:$value)的{
说“'$key'=>“$value'”;
}
对于%hash.sort->$对(:$key,:$value){
比如说$pair;
假设$key==$pair.key和$value==$pair.value;#True
}
#:$key是:key($key)的缩写
对于%hash.sort->(:key($k),:value($v)){
说“$k”=>“$v”;
}
这对于其他没有创建其公共属性列表方法的对象很有用
类C{has$.a;has$.b;has$.C;has$!private value}
我的$c=5;
我的$obj=C.new(:a,是的,这基本上是一样的,因为这里接受任何东西
我想指出的是,你甚至不需要给它提供一个论点,因为它的默认值比你给它的更聪明
Perl 6有许多创建和访问东西的方法。因此,以下任何一种方法都可以工作:
*.key
{.key}{${.key}
->${.key}#基本上是前一行的内容
{$^placeholder-var.key}
sub($){.key}
&a-subroutine-reference#您必须创建子例程
另外,由于所有的普通运算符实际上都是子程序,所以您可以在需要的其他地方使用它们。(不过,我想不出一个在该位置工作的运算符)
&infix:#负责数字加法运算符的子例程
&[+]#同上
&前缀:
&后缀:
#等
就我所见,这两个版本之间的唯一区别是使用了带有隐式$参数的块,而不是使用任何星号,因此它们实际上是等效的
这是Perl,所以有不止一种方法:
my %hash =
two => 2,
three => 3,
one => 1,
;
for %hash.sort(*.key)>>.kv -> ($key, $value) {
say "'$key' => '$value'";
}
为什么在没有hyper>>
提示的情况下,此排序不起作用
sort
将哈希强制为对列表,这就是您将得到的结果:
*.key
{ .key }
{ $^arg.key }
-> $arg { $arg.key }
要消除这些对,您需要在列表上迭代并对每个对调用.kv
:
say %hash.sort(*.key).perl;
# ("one" => "1", "three" => "3", "two" => "2")
您可以在调用.kv
之前强制执行散列
:
say %hash.sort(*.key)>>.kv.perl;
# (("one", "1"), ("three", "3"), ("two", "2"))
say %hash.sort(*.key).map(*.kv).perl;
# (("one", "1"), ("three", "3"), ("two", "2"))
但这当然会破坏练习的目的,因为不能依赖散列排序
您可能已经注意到,根据您编写代码的具体方式,您将得到不同的结果。如果没有尾随的.list
,那么您得到的实际上是一个包裹
,而不是列表
,但语义尚未最终确定
请注意,尽管返回的对象都可能带有简单的括号,但有些是地块,有些是列表,您可以通过调用.WHAT
进行检查。这仍然是一项正在进行的工作
还要注意其中一些变体中的内圆括号,您可以通过调用.flat
来摆脱它。如果这样做,您可以使用->$key,$value
作为for循环的签名,而不是->($key,$value)
(或者更明确地说,->$anon($key,$value)
)它使用签名绑定来打开包裹
您可以使用相同的方法来解压成对对象,而不是使用.kv
:
say %hash.sort(*.key).hash.kv.perl;
# ("one", "1", "three", "3", "two", "2")
for
不再扁平化了,这是最近的一个变化。在今天早上我刚用rakudobrew从nom构建的版本上,运行以下命令:perl6-e'my%h=one=>1,two=>2,two=>3;对于%h.sort(*.key)>.kv{.say}'
生成:one1三三两个2代码>。我现在在freenode.net上,这是讨论更改的地方。@BradGilbert:已修复;我偶尔阅读日志,事实上还记得一些关于这方面的自行车赛,几周内没有跟踪perl6的开发,一切都会在背后发生变化;让我们希望答案最终符合当前语义……问题n坐了好几个小时,就在我最后敲定答案的时候,你过来加了一个完美的答案!但别担心,无论如何,请投赞成票;)@Christoph我也在想同样的事情。好吧,不完全一样,但还是一样。(我本来打算等着看哪一个先得票/最多,然后再投票给你的,但现在我看不出等待的意义。)
for %hash.sort(*.key) -> (:$key, :$value) {
say "'$key' => '$value'";
}