在Ruby中,nil || false和false || nil是什么意思?

12

nil || false 返回 false,而 false || nil 返回 nil。有人能解释一下吗?


对于加分题,解释为什么 nil || false and false || nil 的结果是 false。当我们在 Ruby 中使用逻辑运算符时,它们的优先级是从左到右。在这个例子中,首先执行 nil || false,它的结果是 false。然后执行 false && false,它的结果也是 false。最后执行 false || nil,它的结果是 nil。因此,整个表达式的结果是 false。 - pguardiario
@pguardiario https://dev59.com/uHI-5IYBdhLWcg3weoFO - x1a4
3个回答

19

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

对于你提到的两个例子,|| 表达式左侧评估后为假值,所以Ruby会继续评估右侧并返回其值。


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

3

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接