如何在Raku中用Z运算符或超运算符实现带精度的数组逐元素测试
Raku中用Z运算符或超运算符实现逐元素精度测试
你原本的测试代码用is直接比较数组,但无法控制浮点精度;自己实现的循环测试函数虽然可行,但可以用Raku的Z运算符或超运算符来简化代码,让写法更符合语言习惯。
方法一:使用Z运算符配对元素
Z运算符可以将两个列表的对应元素两两配对,配合for循环就能逐个调用is-approx做精度校验:
use Test; sub myoutput($n) { (1..$n)>>.sqrt } my @expected = (1, 1.4142135623730951, 1.7320508075688772); my $precision = 1e-12; my @actual = myoutput(3); # 先校验列表长度一致 is +@actual, +@expected, "输出与预期列表长度匹配"; # 用Z配对元素,逐个测试精度 for @actual Z @expected -> ($act, $exp) { is-approx $act, $exp, $precision; } done-testing;
@actual Z @expected会生成((1,1), (1.414...,1.414...), (1.732...,1.732...))这样的配对序列,循环遍历每一对即可完成逐元素测试。
方法二:使用超运算符(Hyper Operator)
超运算符可以让测试函数对列表的每一对元素批量生效,写法更简洁:
use Test; sub myoutput($n) { (1..$n)>>.sqrt } my @expected = (1, 1.4142135623730951, 1.7320508075688772); my $precision = 1e-12; my @actual = myoutput(3); # 先校验列表长度 is +@actual, +@expected, "输出与预期列表长度匹配"; # 用超运算符批量调用is-approx @actual >>&is-approx($precision)<< @expected; done-testing;
这里>>&is-approx($precision)<<的作用是:对@actual和@expected的每一对对应元素,执行is-approx($actual-elem, $expected-elem, $precision),自动完成逐元素的精度测试,无需手动写循环。
两种方法的优势
相比你手动实现的loop循环,这两种写法更简洁直观,符合Raku的函数式编程风格,同时保留了精度控制的能力。如果需要额外的长度校验,提前加一句is +@actual, +@expected即可让测试更严谨。
内容的提问来源于stack exchange,提问作者Suman
相关产品推荐
相关产品推荐

