检查一个variables是不是零和ruby不为零

我正在使用下面的代码来检查一个variables是不是零,而不是零

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

有一个更好的方法吗?

除非discount.nil?  || 折扣== 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 

谨防通常的免责声明…巨大的权力/责任,导致黑暗面的猴子补丁等

好的,5年过去了….

 if discount.try :nonzero? ... end 
除非[零,0]。包括?(折扣) 
   #...
结束
 if (discount||0) != 0 #... end 

从Ruby 2.3.0开始,您可以将安全导航运算符( &. )与Numeric#nonzero?&. 如果实例nilnonzero?则返回nil nonzero? – 如果这个数字是0

 if discount&.nonzero? # ... end 

或者后缀:

 do_something if discount&.nonzero? 

你可以这样做:

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

这里的顺序很重要,因为如果discountnil ,那么它不会zero? 方法。 Ruby的短路评估应该防止它试图评估discount.zero? 但是,如果discountnil

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

 "".to_i.zero? => true nil.to_i.zero? => true 
 if discount and discount != 0 .. end 

更新, discount = false将为discount = false

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

 unless discount.to_i.zero? # Code here end 

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

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

如果我们通过“”将返回false而空白? 返回true。 数据=虚假空白的情况也是如此 对于零,假,空或空白string返回true。 所以最好使用空白? 避免空string的方法。

在处理数据库logging时 ,我喜欢用0来初始化所有的空值,使用迁移助手:

 add_column :products, :price, :integer, default: 0 
 if discount.nil? || discount == 0 [do something] end 

只要您的代码在初始化之前保证不尝试使用,您可以将折扣初始化为0。 这将取消一个支票,我想不出来。

我相信以下对于Ruby代码来说已经足够了。 我不认为我可以写一个unit testing,显示这个和原来的区别。

 if discount != 0 end