【发布时间】:2012-09-23 23:45:40
【问题描述】:
nil || false 返回 false 和 false || nil 返回 nil。有人对此有解释吗?
【问题讨论】:
-
对于奖励积分,请解释为什么
nil || false and false || nil评估为假 -
@pguardiario stackoverflow.com/questions/1840488/…
nil || false 返回 false 和 false || nil 返回 nil。有人对此有解释吗?
【问题讨论】:
nil || false and false || nil 评估为假
正如其他人指出的那样,|| 首先计算左侧的表达式。如果它是“真”(除了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 是什么)。
【讨论】:
在 Ruby 中,一切都是表达式,表达式将返回在其中计算的最后一个值。
对于您的两个示例,|| 表达式的左侧计算结果为假值,因此 Ruby 计算右侧并返回它。
【讨论】: