【发布时间】:2018-05-10 12:25:59
【问题描述】:
grep 中使用的* > 20 && * %% 5 似乎是错误的,是否等于带有 2 个参数的whateverCode lambda?正如SO上的解释@
> my @a = 1,12,15,20,25,30,35,37;
> @a.grep: * > 20 && * %% 5 # The result seems strange, expected (25 30 35)
(15 20 25 30 35)
> @a.grep: * %% 5 && * > 20
(25 30 35 37)
> @a.grep: { $_>20 && $_ %% 5 }
(25 30 35)
> @a.grep: all(* > 20, * %% 5)
(25 30 35)
> @a.grep: -> $a { all($a > 20, $a %% 5) }
(25 30 35)
> @a.grep: -> $a {$a > 20 && $a %% 5}
(25 30 35)
【问题讨论】:
-
奇怪的是,如果你反转
&&的操作数,它会起作用:@a.grep: * %% 5 && * > 20 -
@Håkon Hægland 不,它似乎在
&&的右侧计算结果:* %% 5 && * > 20是* > 20 -
@raiph 也许你是对的,这是一个错误
-
再次删除。所以除了前两个之外,你所有的案例都是有道理的,对吧?在第 4 种情况下使用两个
*是两个使用一个*,因为,分隔表达式。所以你只使用了两个*,在前两种情况下,你会期望创建一个两个arg lambda。使用 occam 的剃刀,我注意到前两种情况似乎只是在做相当于忽略&&左手的一个 arg lambda。另外,Brian 的猜测并不能解释您的第一个案例。 -
引用我之前的评论:“所以你只使用了两个
*,在前两种情况下,人们期望创建一个两个 arg lambda。”所以,我们的期望就是问题所在。请参阅您和我的回答,以了解与您的前两种情况类似的代码清楚地产生了一个 arg lambdas - 以及我对原因的回答。
标签: raku