检查变量是否为零并且在ruby中不为零

时间:2008-10-31 00:05:57

标签: ruby

我使用以下代码检查变量是否为零而不是零

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

有更好的方法吗?

18 个答案:

答案 0 :(得分:381)

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

答案 1 :(得分:40)

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

谨防通常的免责声明......强大的权力/责任,猴子修补导致黑暗面等。

答案 2 :(得分:25)

unless [nil, 0].include?(discount) 
  # ...
end

答案 3 :(得分:25)

好的,过了5年......

if discount.try :nonzero?
  ...
end

请务必注意,try是在ActiveSupport gem中定义的,因此在普通红宝石中不可用。

答案 4 :(得分:19)

从Ruby 2.3.0开始,您可以将安全导航操作符(&.)与Numeric#nonzero?组合在一起。如果实例为&.nil,则nil会返回nonzero? - 如果数字为0,则会返回if discount&.nonzero? # ... end

do_something if discount&.nonzero?

或后缀:

{{1}}

答案 5 :(得分:16)

if (discount||0) != 0
  #...
end

答案 6 :(得分:13)

你可以这样做:

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

此处的顺序很重要,因为如果discountnil,那么它将不会有zero?方法。 Ruby的短路评估应该阻止它尝试评估discount.zero?,但是,如果discountnil

答案 7 :(得分:11)

您可以将空行转换为整数值并检查零吗?

"".to_i.zero? => true
nil.to_i.zero? => true

答案 8 :(得分:3)

if discount and discount != 0
  ..
end

更新,false

discount = false

答案 9 :(得分:2)

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

unless discount.to_i.zero?
  # Code here
end

如果discount可以是小数,则可以使用#to_f代替,以防止数字舍入为零。

答案 10 :(得分:2)

def is_nil_and_zero(data)
     data.blank? || data == 0 
end  

如果我们通过""它会返回false而空白?返回true。 data = false时也是如此 空白?对于nil,false,empty或空白字符串返回true。 所以使用空白更好吗?避免空字符串的方法。

答案 11 :(得分:1)

在处理数据库记录时,我喜欢使用迁移帮助程序将所有空值初始化为0:

add_column :products, :price, :integer, default: 0

答案 12 :(得分:0)

只要您的代码保证在初始化之前不尝试使用它,您就可以将折扣初始化为0。那会删除我想的一张支票,我想不出别的什么。

答案 13 :(得分:0)

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

答案 14 :(得分:0)

替代解决方案是使用优化,例如:

module Nothingness
  refine Numeric do
    alias_method :nothing?, :zero?
  end

  refine NilClass do
    alias_method :nothing?, :nil?
  end
end

using Nothingness

if discount.nothing?
  # do something
end

答案 15 :(得分:0)

我更喜欢使用更清洁的方法:

val.to_i.zero?
如果 val val.to_i,则

0将返回nil

此后,我们要做的就是检查最终值是否为

答案 16 :(得分:0)

是的,我们确实采用了干净的红宝石方法。

discount.to_f.zero?

此检查处理了很多情况,例如,折扣可能为零,折扣可能为int 0,折扣可能为浮点数0.0,折扣可能为字符串“ 0.0”,“ 0”。

答案 17 :(得分:-6)

我相信以下内容对于ruby代码来说已经足够了。我认为我不会写一个单元测试,显示它与原始版本之间的任何差异。

if discount != 0
end