You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 17:27:52