我使用以下代码检查变量是否为零而不是零
if(discount != nil && discount != 0)
...
end
有更好的方法吗?
答案 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)
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?)
此处的顺序很重要,因为如果discount
为nil
,那么它将不会有zero?
方法。 Ruby的短路评估应该阻止它尝试评估discount.zero?
,但是,如果discount
是nil
。
答案 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