lis*_*tor 6 string zero divide raku
在添加更多数据之前,我一直在处理大量数据。结果以字符串的形式写入文件,但是我收到了这个错误信息,在我的代码梳理了2天后,我无法找到编程错误;在添加新数据之前,我的代码一直运行良好。
Died with the exception:
Attempt to divide by zero when coercing Rational to Str
in sub analyzeData at /home/xyz/numberCrunch.p6 line 2720
in block at /home/xyz/numberCrunch.p6 line 3363
Segmentation fault (core dumped)
Run Code Online (Sandbox Code Playgroud)
第 2720 行是输出到文件的行: $fh.say("$result");
所以,Rational 似乎是一个延迟评估。有没有办法强制将 Rational 立即转换为小数?或者通过让 Rational 尽早检测到 0 分母使 Rational 变得更聪明?
首先:Rat分母为 的a0是完全合法的有理值。因此,创建Rat分母为 0 的 a 不会在创建时引发异常。
我确实看到两个问题:
Rat分母为 的a 表示0为字符串?Rat?当您将Rats 表示为字符串时,很可能会丢失精度:
say 1/3; # 0.333333
Run Code Online (Sandbox Code Playgroud)
因此,字符串转换的问题Rat更为普遍。幸运的是,有一个.raku不会抛出异常的方法:
say (1/3).raku; # <1/3>
say (42/0).raku; # <42/0>
Run Code Online (Sandbox Code Playgroud)
现在,如果您希望程序在分母为 0 时不将值打印到文件句柄,那么您有多种选择:
trytry $fh.say($result)
Run Code Online (Sandbox Code Playgroud)
$fh.say($result) if $result.denominator
Run Code Online (Sandbox Code Playgroud)
最后,最后的错误消息:“Segmentation failure (core dumped)”有点令人担忧。如果这不是一个多线程程序,我们可能应该尝试找出发生这种情况的原因:执行错误不应该创建段错误。如果是,那么也许我们需要仔细查看您的代码,以找出数组和哈希等结构上是否存在任何竞争条件。