cse*_*ton 76 ruby null design-patterns idioms
我正在寻找一种简洁的方法来检查一个值,看它是零还是零.目前我正在做的事情如下:
if (!val || val == 0)
# Is nil or zero
end
Run Code Online (Sandbox Code Playgroud)
但这看起来很笨拙.
Chr*_*yer 68
对象有零?方法.
if val.nil? || val == 0
[do something]
end
Run Code Online (Sandbox Code Playgroud)
或者,只需一条指令:
[do something] if val.nil? || val == 0
Run Code Online (Sandbox Code Playgroud)
小智 32
如果你真的喜欢最后带有问号的方法名称:
if val.nil? || val.zero?
# do stuff
end
您的解决方案很好,其他一些解决方案也是如此.
如果你不小心,Ruby可以让你搜索一个很好的方法来做所有事情.
Mik*_*eck 29
首先,我认为这是关于您可以检查特定条件的最简洁方法.
其次,对我而言,这是一种代码气味,表明您的设计存在潜在缺陷.通常零和零不应该意味着相同的事情.如果可能的话,你应该尝试在你打到这个代码之前消除val为零的可能性,或者通过检查方法的开头或其他一些机制.
你可能有一个完全合理的理由这样做,在这种情况下我认为你的代码是好的,但我至少考虑试图摆脱零检查,如果可能的话.
ndn*_*kov 28
从Ruby 2.3.0开始,您可以将安全导航operator(&.)与Numeric#nonzero?.如果实例是和,则&.返回- 如果数字为:nilnilnonzero?0
unless val&.nonzero?
# Is nil or zero
end
Run Code Online (Sandbox Code Playgroud)
或后缀:
do_something unless val&.nonzero?
Run Code Online (Sandbox Code Playgroud)
你可以使用Object.nil吗?特别测试nil(而不是在false和nil之间).您也可以将方法修补为对象.
class Object
def nil_or_zero?
return (self.nil? or self == 0)
end
end
my_object = MyClass.new
my_object.nil_or_zero?
==> false
Run Code Online (Sandbox Code Playgroud)
建议不要这样做,因为同事难以跟踪对象的更改,并且可能会使您的代码无法预测.
小智 5
nil.to_i返回零,所以我经常这样做:
val.to_i.zero?
Run Code Online (Sandbox Code Playgroud)
但是,如果val是一个不响应#to_i的对象,则会出现异常.