我正在寻找一种简洁的方法来检查一个值是否为nil或零。当前我在做如下操作:
if (!val || val == 0)
# Is nil or zero
end
但这看起来非常笨拙。
我正在寻找一种简洁的方法来检查一个值是否为nil或零。当前我在做如下操作:
if (!val || val == 0)
# Is nil or zero
end
但这看起来非常笨拙。
对象具有 nil? 方法。
if val.nil? || val == 0
[do something]
end
或者,只需一条指令:
[do something] if val.nil? || val == 0
val && val == 0
更好。 - Nakilonnil.to_i == 0
,因此我建议使用:val.to_i.zero?
。 - Augustin Riedinger&.
)与Numeric#nonzero?
结合使用。&.
返回nil
,如果实例为nil
,而nonzero?
则返回此数字是否为0
。unless val&.nonzero?
# Is nil or zero
end
或者后置表达式:
do_something unless val&.nonzero?
unless val&.nonzero?
的意思是“如果 val 为 nil 或零”。 - Stefando_something if val&.nonzero?
(即如果val
不是nil
且不为零)。 - ndnenkovmy_value&.nonzero? ? do_something : do_something_else
。 - B. Bulpett
if val.nil? || val.zero?
# 做一些事情
end
你的解决方案很好,其他几个解决方案也不错。
如果你不小心的话,Ruby 可以让你寻找一种漂亮的方式来完成所有事情。
首先,我认为这是检查特定条件的最简洁方式。
其次,对我来说,这是一种代码异味,表明您的设计可能存在潜在缺陷。通常,nil和零不应该表示相同的含义。如果可能的话,在进入此代码之前,应尝试消除val为nil的可能性,例如通过在方法开始处检查或其他机制。
您可能有一个完全合法的原因来做这件事,在这种情况下,我认为您的代码是好的,但我至少会考虑尝试消除nil检查。
nil.to_i返回零,因此我经常这样做:
val.to_i.zero?
然而,如果val是一个不能响应#to_i方法的对象,就会收到一个异常。
class Object
def nil_or_zero?
return (self.nil? or self == 0)
end
end
my_object = MyClass.new
my_object.nil_or_zero?
==> false
nil?
将总是返回 false。nil?
只在 NilClass 上返回 true。 - Ryan McGearyObject
、NilClass
和 Numeric
中实现该方法。Object
返回 false
,NilClass
返回 true
,而 Numeric
则返回 zero?
。 - Stefan我的解决方案也使用了改进(Refinements)技术,但是没有条件语句。
module Nothingness
refine Numeric do
alias_method :nothing?, :zero?
end
refine NilClass do
alias_method :nothing?, :nil?
end
end
using Nothingness
if val.nothing?
# Do something
end
我认为你的代码是不正确的,实际上它会测试三个值:nil
、false
和零。这是因为在Ruby中,!val
表达式对于所有的false值都为true,这些false值包括nil
和false
。
目前我能想到的最好的方法是:
if val == nil || val == 0
# do stuff
end
if val&.>(0)
# do something
end
对于val&.>(0)
,当val是nil时,它返回nil,因为>本质上也是一个方法,在ruby中nil等同于false。当val == 0
时,它返回false。
Short and clear
[0, nil].include?(val)
val.nil? || val.zero?
。 - mahemoff