Я использую следующий код, чтобы проверить, не является ли переменная не нулевой, а не нулевой
if(discount != nil && discount != 0)
...
end
Есть ли лучший способ сделать это?
Я использую следующий код, чтобы проверить, не является ли переменная не нулевой, а не нулевой
if(discount != nil && discount != 0)
...
end
Есть ли лучший способ сделать это?
unless discount.nil? || discount == 0 # ... end
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
Важно отметить, что try
определен в геме ActiveSupport, поэтому он недоступен в обычном ruby.
unless [nil, 0].include?(discount) # ... end
Начиная с Ruby 2.3.0, вы можете объединить безопасный навигационный оператор (&.
) с Numeric#nonzero?
. &.
возвращает nil
, если экземпляр был nil
и nonzero?
- если число было 0
:
if discount&.nonzero?
# ...
end
Или постфикс:
do_something if discount&.nonzero?
if (discount||0) != 0
#...
end
Вы можете сделать это:
if (!discount.nil? && !discount.zero?)
Порядок здесь важен, потому что если discount
есть nil
, то он не будет иметь метод zero?
. Оценка короткого замыкания Ruby не должна пытаться оценить discount.zero?
, однако, если discount
- nil
.
Вы можете преобразовать свою пустую строку в целочисленное значение и проверить нуль?.
"".to_i.zero? => true
nil.to_i.zero? => true
if discount and discount != 0
..
end
он будет false
для discount = false
def is_nil_and_zero(data)
data.blank? || data == 0
end
Если мы пройдем "", он вернет false, а пробел? возвращает true. То же самое происходит, когда data = false пустой? возвращает true для nil, false, empty или whitespace string. Так лучше использовать пробел? метод, чтобы избежать пустой строки.
Вы можете использовать метод NilClass
#to_i
, который будет возвращать ноль для значений nil
:
unless discount.to_i.zero?
# Code here
end
Если discount
может быть дробным числом, вы можете вместо этого использовать #to_f
, чтобы исключить округление числа до нуля.
При работе с записью базы данных мне нравится инициализировать все пустые значения с помощью 0, используя помощник миграции:
add_column :products, :price, :integer, default: 0
Вы можете инициализировать скидку до 0 до тех пор, пока ваш код не будет использоваться и не будет использоваться до его инициализации. Я бы не подумал ни о чем другом. Я бы не подумал ни о чем другом.
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 достаточно хорошего качества. Я не думаю, что могу написать unit test, который показывает разницу между этим и оригиналом.
if discount != 0
end