Raku:在将 Rational 强制为 Str 时尝试除以零

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 变得更聪明?

Eli*_*sen 4

首先: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 时不将值打印到文件句柄,那么您有多种选择:

  • 前缀为try
try $fh.say($result)
Run Code Online (Sandbox Code Playgroud)
  • 显式检查分母是否为 0
$fh.say($result) if $result.denominator
Run Code Online (Sandbox Code Playgroud)

最后,最后的错误消息:“Segmentation failure (core dumped)”有点令人担忧。如果这不是一个多线程程序,我们可能应该尝试找出发生这种情况的原因:执行错误不应该创建段错误。如果是,那么也许我们需要仔细查看您的代码,以找出数组和哈希等结构上是否存在任何竞争条件。