无||假和假||在红宝石中没有

时间:2012-10-03 04:22:26

标签: ruby null

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

3 个答案:

答案 0 :(得分:17)

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

对于这两个示例,||表达式的左侧评估为假值,因此Ruby然后评估右侧,并返回它。

答案 1 :(得分:4)

正如其他人指出的那样,||首先评估左边的表达式。如果它是“true”(除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 :(得分:3)

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