当前位置:  开发笔记 > 编程语言 > 正文

最好的红宝石成语为"零或零"

如何解决《最好的红宝石成语为"零或零"》经验,为你挑选了6个好方法。

我正在寻找一种简洁的方法来检查一个值,看它是零还是零.目前我正在做的事情如下:

if (!val || val == 0)
  # Is nil or zero
end

但这看起来很笨拙.



1> Christian Le..:

对象有零?方法.

if val.nil? || val == 0
  [do something]
end

或者,只需一条指令:

[do something] if val.nil? || val == 0


我投票给`val.zero?`而不是`val == 0`
"或"的优先级在这里不需要任何parens,并且将完全自然地读给经验丰富的Rubyist.唯一被`||'与`或`咬过的人是那些从未编程过Perl的人:)
注意使用"或"和"和",顺便说一句,与||相比,它们具有不同且非常低的优先级 和&&.有关一些评论,请参阅http://blog.jayfields.com/2007/08/ruby-operator-precedence-of-and-which.html.
我认为`val && val == 0`更好.

2> 小智..:

如果你真的喜欢最后带有问号的方法名称:


if val.nil? || val.zero?
  # do stuff
end

您的解决方案很好,其他一些解决方案也是如此.

如果你不小心,Ruby可以让你搜索一个很好的方法来做所有事情.



3> Mike Deck..:

首先,我认为这是关于您可以检查特定条件的最简洁方法.

其次,对我而言,这是一种代码气味,表明您的设计存在潜在缺陷.通常零和零不应该意味着相同的事情.如果可能的话,你应该尝试在你打到这个代码之前消除val为零的可能性,或者通过检查方法的开头或其他一些机制.

你可能有一个完全合理的理由这样做,在这种情况下我认为你的代码是好的,但我至少考虑试图摆脱零检查,如果可能的话.


关于代码味道非常正确!+1可能会考虑查看NullObject模式http://en.wikipedia.org/wiki/Null_Object_pattern

4> ndnenkov..:

从Ruby 2.3.0开始,您可以将安全导航operator(&.)与Numeric#nonzero?.如果实例是和,则&.返回- 如果数字为:nilnilnonzero?0

unless val&.nonzero?
  # Is nil or zero
end

或后缀:

do_something unless val&.nonzero?



5> Adrian Dunst..:

你可以使用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

建议不要这样做,因为同事难以跟踪对象的更改,并且可能会使您的代码无法预测.


epochwolf,如果你把它放在Numeric类上,那么`nil?`总是会返回false.`nil?`只在NilClass上返回true.

6> 小智..:

nil.to_i返回零,所以我经常这样做:

val.to_i.zero?

但是,如果val是一个不响应#to_i的对象,则会出现异常.


-1的原因与Scott的答案无效的原因相同。
推荐阅读
手机用户2402851155
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有