Ruby 严格检查假值(不包括零)最危险的方法是什么?
检查值是否为Ruby 严格检查假值(不包括零)最危险的方法是什么?,ruby,Ruby,检查值是否为false而不是nil(哪一个值为false)最危险的方法是什么 使用虚构方法的示例false?: a = false a.false? # should return true a = nil a.false? # should return false 到目前为止,我们有四种不同的方法: a == false # credits to @Ilya a.is_a?(FalseClass) FalseClass === a a.instance_
false
而不是nil
(哪一个值为false)最危险的方法是什么
使用虚构方法的示例false?
:
a = false
a.false? # should return true
a = nil
a.false? # should return false
到目前为止,我们有四种不同的方法:
a == false # credits to @Ilya
a.is_a?(FalseClass)
FalseClass === a
a.instance_of?(FalseClass) # credits to @Ilya
a.nil? ^ !a
到目前为止,我们有四种不同的方法:
a == false # credits to @Ilya
a.is_a?(FalseClass)
FalseClass === a
a.instance_of?(FalseClass) # credits to @Ilya
a.nil? ^ !a
我同意最简单的方法是不区分nil
和false
最面向对象的方法是允许对象自行决定它是否为假,就像您在问题中所做的那样:通过响应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
我同意最简单的方法是不区分nil
和false
最面向对象的方法是允许对象自行决定它是否为假,就像您在问题中所做的那样:通过响应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
使用
a==false
。我认为Ruby的方法是不区分false和false。我同意@spickermann的观点,我想不出需要显式检查false的情况。有一个流行的用例:在Rails 5之前,回调返回的false
表示错误(停止回调链),而忽略了nil
。这已更改(或修复)–回调现在必须抛出:abort。上下文类似于@SimpleTime所描述的内容。假设您有一个以hashmap表示的服务列表。这些服务可能实现了选项
。如果实现了,则选项
的值可能是true
或false
ce没有实现选项
,调用服务[:option]
返回nil
,因为它没有键选项
。如果有,调用服务[:option]
可能返回true
或false
。在上面的示例中,我们只需要检索其选项
已实现并设置为false
的服务。使用a==false
。我认为Ruby的方法是不区分false和false。我同意@spickermann,我想不出任何情况这里我需要显式地检查false。有一个流行的用例:在Rails 5之前,回调的返回值false
表示错误(停止回调链),而nil
被忽略。这被更改(或修复)–回调现在必须抛出:abort。上下文类似于@SimpleTime所描述的内容。假设您有一个以hashmap表示的服务列表。这些服务可能实现了选项
。如果实现了,则选项
的值可能是true
或false
ce没有实现选项
,调用服务[:option]
返回nil
,因为它没有键选项
。如果有,调用服务[:option]
可能返回true
或false
。在上面的示例中,我们只需要检索其选项
已实现并设置为false
的服务。也可以false.instance\u of?(FalseClass)
也可以false.instance\u of?(FalseClass)