12

虽然总是可以使用 mixins 或方法覆盖来修改 Bool 强制,但默认情况下哪些值被认为是真实的,哪些值被认为是虚假的?

注意:这个问题以前被问过,但不幸的是它太老了,它的内容已经完全过时了,现代的 Raku 毫无用处。

4

2 回答 2

13

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

  • 0Rat(除了x/0where x≠0
  • 空列表/集合类型(List、Array、Hash、Map、Set、Bag 等)
  • 空字符串
  • Failure
  • Promise在被保存/损坏之前。
  • StrDistance其之前/之后是相同的。
  • Junction,当你期望的时候。
  • 类型对象
  • 无(技术类型对象)
  • 任何未定义的值(技术类型对象)

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

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

于 2019-09-04T02:42:58.197 回答
7

TL;DR这个答案是基于相关文档的详尽总结。1

  • 基本情况2用于True已定义对象(实例)和False未定义对象(类型对象)。

  • 数值00/0False。(但是Rational具有非零分子的 a 例如1/0isTrue并且(0/0).Num(计算结果为NaN)是True。)

  • 一个空集合(List, Hash, Set,Buf等)是False.

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

  • A 定义FailureFalse

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

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

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

脚注

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

2通过查看 Rakudo 实现代码,尤其是核心的Mu.pm6. 有关相关代码链接,请参阅我对类似 SO 的回答。

于 2019-09-04T18:20:15.317 回答