【问题标题】:What are the truthy and falsy values in Raku?Raku 中的真值和假值是什么?
【发布时间】:2020-01-06 21:31:09
【问题描述】:

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

注意:这个问题是asked previously,但不幸的是它太旧了,它的内容已经完全过时了,现代的乐库也没用了。

【问题讨论】:

    标签: raku truthiness


    【解决方案1】:

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

    • 0x/0Rat 除外,其中 x≠0
    • 空列表/集合类型(List、Array、Hash、Map、Set、Bag 等)
    • 空字符串
    • Failure
    • Promise 在被保留/损坏之前。
    • StrDistance 前后一致。
    • Junction,当您期望时。
    • 类型对象
    • Nil(技术类型对象)
    • 任何未定义的值(技术类型对象)

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

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

    【讨论】:

    • 当然任何对象都可以有它自己的.Bool 方法并且可以处理它自己的真实性。如果需要,您还可以使用组合来处理经典的 DBI 案例:0 but True;
    • @Scimon:确实如此。实际上,我之所以写这个问题/答案只是因为我正在写一篇关于类似主题的博客文章,并且想链接到一个很好的概述,就像其他语言一样,并意识到 P6 的 SE 问题确实已经过时了。我把你在博客里提到的两件事都谈了哈
    【解决方案2】:

    TL;DR此答案是基于相关文档的详尽摘要。1

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

    • 数值上的0 值或0/0False。 (但Rational 具有非零分子,例如1/0True(0/0).Num(计算结果为NaN)是True。)

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

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

    • 定义的FailureFalse

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

    • 定义的StrDistanceFalse,如果它表示的字符串转换对正在转换的字符串没有影响。

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

    脚注

    1 我写了第一个项目符号,因为它是 P6 的基础,并且通过检查编译器的代码来确认它是正确的。2 另一个要点总结了撰写the .Bool doc page 的答案时的内容,此时它列出了 20 种类型。如果后一页不完整,则此答案不完整。

    2 基本情况可以通过查看 Rakudo 实现代码,特别是核心的 Mu.pm6 来了解。相关代码链接见my answer to a similarish SO

    【讨论】:

    • +1 我不认为失败和承诺。我会更新我的以包括这些。我认为快速参考和你的详细答案是一个很好的组合,可以让人们查找内容并找到这个问题
    猜你喜欢
    • 2020-01-04
    • 1970-01-01
    • 2017-02-20
    • 2015-07-25
    • 2018-07-01
    • 2014-09-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多