12

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

4

3 回答 3

19

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

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

于 2012-10-03T04:28:43.997 回答
4

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

||不仅仅对布尔测试有用。例如,前几天我在为chronicgem 编写一些代码时使用了它:

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

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

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

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

do_something && do_something_else

(只有当您知道 的返回值do_something永远不会是falseor时才有效nil!)

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

message && send_message(message)

哪个可以代替:

unless message.nil?
  send_message(message)
end
于 2012-10-03T04:38:41.803 回答
3

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

于 2012-10-03T04:28:53.123 回答