Raku中如何实现数组所有元素除以同一个指定数值
问题原因
直接对数组变量使用/=运算符不符合Raku的运算规则:@e /= @e.min本质等价于@e = @e / @e.min,这种写法会把整个数组放到数值上下文里坍缩为单个值参与运算,最终赋值给数组的自然只有单个元素,达不到逐元素运算的效果。
正确实现方式
可以根据使用场景选择以下几种写法:
- 逐元素运算生成新数组(不修改原数组):用Raku内置的hyper超算符最简洁,是专门面向批量逐元素操作的语法:
my @e = <60.922 20.946 8.721 7.292 4.306 2.821 2.765 2.752 2.741 2.725>; my $min = @e.min; # 提前缓存最小值,避免重复计算 my @normalized = @e >>/>> $min;
>>/>>会自动遍历左侧数组的每一个元素,分别和右侧的值做除法,最终返回所有计算结果组成的新数组,不需要手动写循环。
- 直接修改原数组(原地更新):可以用
map配合方法赋值运算符实现:
my @e = <60.922 20.946 8.721 7.292 4.306 2.821 2.765 2.752 2.741 2.725>; my $min = @e.min; @e .= map: * / $min;
- 偏好直白逻辑的话,直接遍历数组修改即可,可读性最高:
my @e = <60.922 20.946 8.721 7.292 4.306 2.821 2.765 2.752 2.741 2.725>; my $min = @e.min; $_ /= $min for @e;
注意:所有原地修改的写法都建议提前把数组最小值存到单独变量里,不要在遍历/映射过程中反复调用
@e.min,否则前面元素修改后会导致最小值计算错误,最终结果不符合预期。
内容的提问来源于stack exchange,提问作者con
相关产品推荐
相关产品推荐

