虽然可以始终使用 mixin 或方法覆盖来修改 Bool 强制转换,默认情况下,哪些值被认为是真值,哪些值被认为是假值?
注意:此问题曾经在 Stack Overflow 上发问过,但很不幸,由于它太旧了,其内容已经完全过时,对现代的 Raku 来说毫无用处。
虽然可以始终使用 mixin 或方法覆盖来修改 Bool 强制转换,默认情况下,哪些值被认为是真值,哪些值被认为是假值?
注意:此问题曾经在 Stack Overflow 上发问过,但很不幸,由于它太旧了,其内容已经完全过时,对现代的 Raku 来说毫无用处。
每种类型通过在布尔上下文中调用的.Bool
方法自行决定,因此不存在真值。对于内置类型,在调用其.Bool
方法时以下情况返回False
。
0
(除了x≠0
的Rat
)Failure
Promise
(在被履行/拒绝之前)。StrDistance
。Junction
。否则,默认情况下,任何已定义的值在调用其.Bool
方法时都会返回True
。这包括在其他语言中可能不是真值的Str
'0'
、NaN
和零长度范围(0^..^0
)。
该答案旨在提供快速参考。有关更详细的讨论,请参见此答案。
TL;DR 这个答案是基于相关文档的详尽总结。1
基本情况2是对于一个定义的对象(一个实例)为True
,而对于未定义的对象(一种类型的对象)为False
。
数值上,0
值或 0/0
是False
。(但是非零分子的有理数例如1/0
为True
,而评估为 NaN
的 (0/0).Num
也为 True
。)
空集合(List
、Hash
、Set
、Buf
等)为False
。
空字符串(例如文字""
)为False
。(注意:"0"
、"0.0"
等为True
。)
已定义Failure
为False
。
已定义的Promise
在其状态变为Kept
/Broken
之前为False
。
如果表示对被转换的字符串没有影响,则已定义的StrDistance
为False
。
已定义的Junction
取决于交集类型及其元素的True
/False
值,可能为True
或False
。
1 我撰写了第一个项目符号,基于我知道它是P6的基础,并通过检查编译器的代码进行确认。2 其他项目符号总结了.Bool
文档页面在本回答撰写时列出的20种类型的内容。如果后者页面不完整,则本回答也不完整。
2 通过查看Rakudo实现代码,特别是核心的Mu.pm6
,可以看到基本情况。请参见我对类似SO的问题的回答以获取相关代码链接。
.Bool
方法并处理自己的真实性。如果需要,您还可以使用组合来处理经典的 DBI 情况:0 but True;
- Scimon Proctor