我正在使用以下代码检查变量是否不是nil也不为零
if(discount != nil && discount != 0)
...
end
有一个更好的方法吗?
discount
是假的怎么办?
discount.in? [0, nil]
可能有一种更清洁的方法
我正在使用以下代码检查变量是否不是nil也不为零
if(discount != nil && discount != 0)
...
end
有一个更好的方法吗?
discount
是假的怎么办?
discount.in? [0, nil]
可能有一种更清洁的方法
Answers:
除非discount.nil?|| 折扣== 0 #... 结束
The and and or keywords are banned. It's just not worth it. Always use && and || instead.
。没错,出于大卫和汤姆的原因。
好,五年过去了。
if discount.try :nonzero?
...
end
重要的是要注意,它try
是在ActiveSupport gem中定义的,因此在纯红宝石中不可用。
try
方法。
try
可以显示替代选项的(这就是为什么它一开始就被否决了!),只要清楚读者ActiveSupport
不是香草红宝石。
除非[nil,0] .include?(折扣) #... 结束
从Ruby 2.3.0开始,您可以将安全导航运算符(&.
)与结合使用Numeric#nonzero?
。如果实例为,则&.
返回--如果数字为:nil
nil
nonzero?
0
if discount&.nonzero?
# ...
end
或后缀:
do_something if discount&.nonzero?
"foo"&.nonzero? # => NoMethodError: undefined method 'nonzero?' for "foo":String
....在任意对象上使用都不安全。
nil
。
nonzero?
-如果数字为0
”中指出。0
与检查可能存在或可能不存在的数字相比,很少需要检查是否存在完全任意的对象nil
。因此,几乎暗示了这一点。即使某人以某种方式做出了相反的假设,当他们尝试执行该假设时,他们也会立即了解正在发生的事情。
if discount.nil? || discount == 0
[do something]
end
替代解决方案是使用优化,如下所示:
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
我相信以下对于Ruby代码已经足够了。我不认为我可以编写一个单元测试来显示此版本与原始版本之间的任何差异。
if discount != 0
end
true
是否有折扣nil
。