我使用下面的代码来检查一个变量是否不为零

if(discount != nil && discount != 0) 
  ...
end

还有更好的办法吗?


当前回答

从Ruby 2.3.0开始,您可以将安全导航操作符(&.)与数字#非零?结合使用。&。如果实例为nil且非零,则返回nil ?—如果数字为0:

if discount&.nonzero?
  # ...
end

或后缀:

do_something if discount&.nonzero?

其他回答

unless discount.nil? || discount == 0
  # ...
end

你可以利用NilClass提供的#to_i方法,它将为nil值返回零:

unless discount.to_i.zero?
  # Code here
end

如果折扣可以是小数,则可以使用#to_f来代替,以防止数字四舍五入为零。

你可以这样做:

if (!discount.nil? && !discount.zero?)

这里的顺序很重要,因为如果discount是nil,那么它就不会是0 ?方法。Ruby的短路评估应该阻止它尝试评估折扣。零?,但如果折扣为nil。

你可以把discount初始化为0,只要你的代码保证在初始化之前不尝试使用它。我想这只会删除一张支票,我想不出还有什么。

class Object
  def nil_zero?
    self.nil? || self == 0
  end
end

# which lets you do
nil.nil_zero? # returns true
0.nil_zero?   # returns true
1.nil_zero?   # returns false
"a".nil_zero? # returns false

unless discount.nil_zero?
  # do stuff...
end

当心那些常见的免责声明……巨大的权力/责任,猴子补丁导致黑暗面等等。