nil || false
返回 false
,而 false || nil
返回 nil
。有人能解释一下吗?
在Ruby中,一切都是表达式,表达式会返回其中最后一个被评估的值。
对于你提到的两个例子,||
表达式左侧评估后为假值,所以Ruby会继续评估右侧并返回其值。
||
首先评估左侧的表达式。如果它是“true”(除了false
或nil
之外的任何内容),它将返回该值。否则,它会评估右侧的表达式,并返回它(无论它是什么)。||
有很多用途,不仅限于布尔测试。例如,我最近在编写chronic
gem代码时就使用了它。@now = options[:now] || Chronic.time_class.now
options
哈希中包含一个:now
值,则将其存储在@now
中。否则,回退到Chronic.time_class.now
作为默认值。”我相信你可以想到很多在自己的程序中可能应用到的情况。
&&
类似:它首先评估左侧的表达式,如果评估为false
或nil
,则返回该值。否则,它评估右侧的表达式,并返回它(无论它是什么)。&&
也适用于远不止布尔测试。你可以使用它将两行代码压缩成一行。例如:do_something && do_something_else
(只有当您知道do_something
的返回值永远不会是false
或nil
时,才能这样使用!)
您还可以使用&&
将“守卫”表达式压缩在与其“守卫”的同一行上:
message && send_message(message)
可以替代的选择:
unless message.nil?
send_message(message)
end
||
返回最后一个被评估的表达式的结果。如果它评估 LHS 并找到一个 true
值,那么你将得到 LHS;否则,你将得到 RHS(无论 RHS 是什么)。
nil || false and false || nil
的结果是 false。当我们在 Ruby 中使用逻辑运算符时,它们的优先级是从左到右。在这个例子中,首先执行nil || false
,它的结果是 false。然后执行false && false
,它的结果也是 false。最后执行false || nil
,它的结果是 nil。因此,整个表达式的结果是 false。 - pguardiario