Perl 6中的真假值是什么?

use*_*601 12 perl6 truthiness raku

尽管总是可以使用mixins或方法重写来修改Bool强制,但是默认情况下哪些值被认为是真实的而哪些值被认为是虚假的?

注意:这个问题之前曾被问过,但不幸的是它太旧了,其内容已完全过时,而现代Perl 6则毫无用处。

use*_*601 12

没有真实值,因为每种类型都是通过.Bool在布尔上下文中调用的方法自行确定的。对于内置类型,调用False.Bool方法时将返回以下内容。

  • 0(除Ratx/0其中x?0
  • 空列表/集合类型(列表,数组,哈希,映射,集合,包等)
  • 空字符串
  • Failure
  • Promise 在保留/破坏之前。
  • StrDistance 之前/之后的相同。
  • Junction,如您所愿。
  • 类型对象
  • 零(技术类型的对象)
  • 任何未定义的值(技术上为对象的类型)

否则,默认情况下,将True.Bool调用其方法时返回任何定义的值。这包括Str '0'NaN,和零长度范围(0^..^0),在其他语言中可能不是truthy。

此答案仅供参考。请参阅此答案以进行更详细的讨论。


rai*_*iph 7

TL; DR此答案是基于相关文档的详尽概述。1个

  • 基础案例2True用于定义对象(一个实例),并False为未定义一个(一种类型的对象)。

  • 数值00/0False。(但是Rational具有非零分子的a ,例如1/0is True(0/0).Num(其值为NaN)是True。)

  • 一个空的集合(ListHashSetBuf,等)是False

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

  • 定义FailureFalse

  • 甲定义PromiseFalse,直到其状态变为Kept/ Broken

  • 定义的StrDistanceFalse它表示的字符串转换是否对要转换的字符串没有影响。

  • 定义JunctionTrueFalse取决于结的类型及其元素的True/ False值。

脚注

1我写了第一个项目符号项目是基于知道它是真实的,因为它是P6的基础,并通过检查编译器的代码进行确认。2其他的要点总结在写这个答案的时间内容.Bool文档页面,此时将其列出的20种。如果后一页不完整,则此答案不完整。

2通过查看Rakudo实现代码,尤其是内核的代码,可以看到基本情况Mu.pm6。有关相关代码链接,请参见我对类似SO的回答