【问题标题】:nil || false and false || nil in ruby无 ||假与假||红宝石中的零
【发布时间】:2012-09-23 23:45:40
【问题描述】:

nil || false 返回 falsefalse || nil 返回 nil。有人对此有解释吗?

【问题讨论】:

标签: ruby null


【解决方案1】:

正如其他人指出的那样,|| 首先计算左侧的表达式。如果它是“真”(除了falsenil 之外的任何东西),它就会返回它。否则,它计算右边的表达式,并返回它(不管它是什么)。

这使得|| 不仅仅适用于布尔测试。例如,我前几天在为chronic gem 编写代码时使用了它:

@now = options[:now] || Chronic.time_class.now

这意味着:“如果options 哈希包含:now 值,则将其存储在@now 中。否则,默认使用Chronic.time_class.now”。我相信您可以在自己的程序中想到很多可能的应用程序。

&& 是类似的:它首先计算左边的表达式,如果它计算为falsenil,它返回那个。否则,它计算右边的表达式,并返回它(不管它是什么)。

这意味着&&不仅对布尔测试有用。您可以使用它将两行代码压缩为一行。例如:

do_something && do_something_else

(只有知道do_something 的返回值永远不会是falsenil!)

您还可以使用&& 将“守卫”表达式与“守卫”放在同一行:

message && send_message(message)

哪些可以替代:

unless message.nil?
  send_message(message)
end

【讨论】:

    【解决方案2】:

    || 返回最后一个表达式的计算结果。如果它评估 LHS 并找到 true 值,则得到 LHS;否则,您将获得 RHS(无论 RHS 是什么)。

    【讨论】:

      【解决方案3】:

      在 Ruby 中,一切都是表达式,表达式将返回在其中计算的最后一个值。

      对于您的两个示例,|| 表达式的左侧计算结果为假值,因此 Ruby 计算右侧并返回它。

      【讨论】:

        猜你喜欢
        • 2016-12-14
        • 1970-01-01
        • 1970-01-01
        • 2023-03-30
        • 1970-01-01
        • 1970-01-01
        • 2011-02-03
        • 2019-05-16
        • 2017-08-10
        相关资源
        最近更新 更多