【发布时间】:2020-12-16 13:22:56
【问题描述】:
是否有一种理想的或更短的方法来“比较两个值但不允许它们为 nil”。
一种方法是:
(!left.nil? || !right.nil?) && (left == right)
这里可以省略其中一个 nil 检查,但我将其留在示例中,以更好地显示意图。
在 Ruby 核心、Kernel 或 BasicObject 上,equal?、eql?、== 旁边是否有与此匹配的方法?
我的目标类似于例如minitest assert_equal 确实(为简洁而编辑,第 5 行无检查):
def assert_equal exp, act, msg = nil
msg = message(msg, E) { diff exp, act }
result = assert exp == act, msg
if nil == exp then
refute_nil exp, "Use assert_nil if expecting nil."
end
result
end
在我的情况下,这是一个自动化系统,我必须反复防范双方都是nil。例如
class ContactPolicy < ApplicationPolicy
def add?
!actor.id.nil? && subject.id == actor.id
end
end
在以各种形式重复该模式之后,我想知道是否没有更好的 Ruby 主义。我现在倾向于使用null-objects 进行重构,def ==(other) 总是返回 false。不过,这个“相等但不为零”的问题是否仍然很有趣。
【问题讨论】:
-
如果你检查
left == right,你只需要检查一个是nil,而不是两个 -
谢谢,萨拉。我试图解释:!right.nil?这里可以省略。我会尝试在编辑中进一步澄清这一点。
-
你的代码的intent是模糊的。您似乎正在尝试检查某些值是否既是
defined?又不是零,以避免(nil == nil) == true。无论您是否可以创建更短的表达式,我都会专注于更好地传达意图。我在下面提供了一个很好的中间立场恕我直言的答案,但我真的建议要么重构你的代码以避免首先需要这样做,要么更明确而不是争取单线。跨度>
标签: ruby comparison