什么是Rubiest方式检查值是false
而不是nil
(这是一个假值)?
使用虚构方法false?
的示例:
a = false
a.false? # should return true
a = nil
a.false? # should return false
答案 0 :(得分:2)
到目前为止,我们有四种不同的方法:
a == false # credits to @Ilya
a.is_a?(FalseClass)
FalseClass === a
a.instance_of?(FalseClass) # credits to @Ilya
a.nil? ^ !a
答案 1 :(得分:2)
我同意@spickermann's comment to your question,认为不区分nil
和false
的方式最为方便。
最 OO 的方式是允许对象自行决定它是否为假,只是你在问题中的方式:通过回复false?
消息。
class TrueClass
def true?
true
end
end
class FalseClass
def false?
true
end
end
class Object
def true?
false
end
def false?
false
end
end
如果你想成为一个好的Ruby公民,你将这些monkeypatches封装在一个mixin中,以便它们出现在祖先链中:
module StrictlyTrue
def true?
true
end
end
class TrueClass
include StrictlyTrue
end
module StrictlyFalse
def false?
true
end
end
class FalseClass
include StrictlyFalse
end
module NeitherFalseNorTrue
def true?
false
end
def false?
false
end
end
class Object
include NeitherFalseNorTrue
end
如果你想要完全不错,你可以将其包装在精炼中:
module StrictlyTrue
def true?
true
end
end
module StrictlyFalse
def false?
true
end
end
module NeitherFalseNorTrue
def true?
false
end
def false?
false
end
end
module StrictBooleans
refine TrueClass do
include StrictlyTrue
end
refine FalseClass do
include StrictlyFalse
end
refine Object do
include NeitherFalseNorTrue
end
end