Raku 中的真值和假值是什么?

What are the truthy and falsy values in Raku?

虽然始终可以使用混合或方法覆盖来修改 Bool 强制转换,默认情况下哪些值被认为是真实的,哪些值被认为是虚假的?

注意:这个问题是 asked previously,但不幸的是它太旧了,它的内容完全过时了,现代 Raku 也没用。

没有真值,因为每种类型都通过在布尔上下文中调用的 .Bool 方法自行决定。对于内置类型,当它们的 .Bool 方法被调用时,下面的 return False.

  • 0x/0Rat 除外,其中 x≠0
  • 空 list/collection 类型(List、Array、Hash、Map、Set、Bag 等)
  • 空字符串
  • Failure
  • Promise 在 kept/broken.
  • 之前
  • StrDistance before/after 相同
  • Junction,如你所愿。
  • 键入对象
  • 无(技术类型对象)
  • 任何未定义的值(技术类型对象)

否则,任何定义的值默认为 returns True 当它的 .Bool 方法被调用时。这包括 Str '0'NaN 和零长度范围 (0^..^0),在其他语言中可能不真实。

此回答旨在作为快速参考。有关更详细的讨论,请参阅

TL;DR 此答案是基于相关文档的详尽摘要。1

  • 基本情况2对于定义的对象(实例)是True,对于未定义的对象(实例)是False输入对象)。

  • 在数值上 0 值或 0/0False。 (但是 Rational 具有非零分子,例如 1/0True(0/0).Num(计算结果为 NaN)是 True。)

  • 空集合(ListHashSetBuf 等)是 False.

  • 一个空字符串(例如文字 "")是 False。 (注意。"0""0.0"等是True。)

  • 定义的FailureFalse

  • 一个定义的PromiseFalse直到它的状态变成Kept/Broken.

  • 定义的 StrDistanceFalse 如果它表示的字符串转换对正在转换的字符串没有影响。

  • A 定义的 JunctionTrueFalse 取决于结点的类型和它的 True/False 值元素.

脚注

1 我写第一个项目符号项目是基于知道它是真实的,因为它是 P6 的基础,并通过检查编译器的代码来确认它。 2 其他要点总结了撰写此 the .Bool doc page 答案时的内容,其中列出了 20 种类型。如果后一页不完整,则此答案不完整。

2 通过查看 Rakudo 实现代码可以看出基本情况,特别是核心的 Mu.pm6。相关代码链接见