在Raku中,什么是真值和假值?

12

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

注意:此问题曾经在 Stack Overflow 上发问过,但很不幸,由于它太旧了,其内容已经完全过时,对现代的 Raku 来说毫无用处。

2个回答

13

每种类型通过在布尔上下文中调用的.Bool方法自行决定,因此不存在真值。对于内置类型,在调用其.Bool方法时以下情况返回False

  • 0(除了x≠0Rat
  • 空列表/集合类型(List、Array、Hash、Map、Set、Bag等)
  • 空字符串
  • Failure
  • 未完成的Promise(在被履行/拒绝之前)。
  • 前后相同的StrDistance
  • 当您期望它时的Junction
  • 类型对象
  • Nil(技术上是类型对象)
  • 任何未定义的值(技术上是类型对象)

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

该答案旨在提供快速参考。有关更详细的讨论,请参见此答案


当然,任何对象都可以有自己的 .Bool 方法并处理自己的真实性。如果需要,您还可以使用组合来处理经典的 DBI 情况:0 but True; - Scimon Proctor
@Scimon:确实。我写这个问题/答案只是因为我正在写一篇类似主题的博客文章,想要链接到像其他语言那样的好概述,并意识到 P6 的 SE 问题已经过时了。我在博客中谈到了你提到的两个方面。 - user0721090601

8

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

  • 基本情况2是对于一个定义的对象(一个实例)为True,而对于未定义的对象(一种类型的对象)为False

  • 数值上,0 值或 0/0False。(但是非零分子的有理数例如1/0True,而评估为 NaN(0/0).Num 也为 True。)

  • 空集合(ListHashSetBuf 等)为False

  • 空字符串(例如文字"")为False。(注意:"0""0.0" 等为True。)

  • 已定义FailureFalse

  • 已定义的Promise在其状态变为Kept/Broken之前为False

  • 如果表示对被转换的字符串没有影响,则已定义的StrDistanceFalse

  • 已定义的Junction取决于交集类型及其元素的True/False值,可能为TrueFalse

脚注

1 我撰写了第一个项目符号,基于我知道它是P6的基础,并通过检查编译器的代码进行确认。2 其他项目符号总结了.Bool文档页面在本回答撰写时列出的20种类型的内容。如果后者页面不完整,则本回答也不完整。

2 通过查看Rakudo实现代码,特别是核心的Mu.pm6,可以看到基本情况。请参见我对类似SO的问题的回答以获取相关代码链接。


1
+1 我没有考虑到失败和承诺。我会更新我的内容,包括这些方面。我认为提供一个简明的快速参考和你详细的答案对于查找信息并找到这个问题的人来说是一个很好的组合。 - user0721090601

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接