【发布时间】:2020-01-06 21:31:09
【问题描述】:
虽然总是可以使用 mixins 或方法覆盖来修改 Bool 强制,默认情况下哪些值被认为是真实的,哪些值被认为是虚假的?
注意:这个问题是asked previously,但不幸的是它太旧了,它的内容已经完全过时了,现代的乐库也没用了。
【问题讨论】:
标签: raku truthiness
虽然总是可以使用 mixins 或方法覆盖来修改 Bool 强制,默认情况下哪些值被认为是真实的,哪些值被认为是虚假的?
注意:这个问题是asked previously,但不幸的是它太旧了,它的内容已经完全过时了,现代的乐库也没用了。
【问题讨论】:
标签: raku truthiness
没有真实值,因为每种类型都通过在布尔上下文中调用的.Bool 方法自行决定。对于内置类型,当调用其 .Bool 方法时,以下返回 False。
0(x/0 的 Rat 除外,其中 x≠0)Failure Promise 在被保留/损坏之前。StrDistance 前后一致。Junction,当您期望时。否则,任何定义的值在调用其.Bool 方法时默认返回True。这包括 Str '0'、NaN 和零长度范围 (0^..^0),在其他语言中可能不真实。
此答案旨在作为快速参考。有关更详细的讨论,请参阅 this answer。
【讨论】:
.Bool 方法并且可以处理它自己的真实性。如果需要,您还可以使用组合来处理经典的 DBI 案例:0 but True;
TL;DR此答案是基于相关文档的详尽摘要。1
基本情况2对于已定义对象(实例)是True,对于未定义对象(类型对象)是False。
数值上的0 值或0/0 是False。 (但Rational 具有非零分子,例如1/0 是True 和(0/0).Num(计算结果为NaN)是True。)
一个空集合(List、Hash、Set、Buf 等)是False。
一个空字符串(例如文字"")是False。 (注:"0"、"0.0" 等是True。)
定义的Failure 是False。
定义的Promise 是False,直到其状态变为Kept/Broken。
定义的StrDistance 是False,如果它表示的字符串转换对正在转换的字符串没有影响。
定义的Junction 是True 或False,具体取决于结的类型及其元素的True/False 值。
1 我写了第一个项目符号,因为它是 P6 的基础,并且通过检查编译器的代码来确认它是正确的。2 另一个要点总结了撰写the .Bool doc page 的答案时的内容,此时它列出了 20 种类型。如果后一页不完整,则此答案不完整。
2 基本情况可以通过查看 Rakudo 实现代码,特别是核心的 Mu.pm6 来了解。相关代码链接见my answer to a similarish SO。
【讨论】: