Проверка того, что переменная не равна нулю, а не равна нулю в рубине

Я использую следующий код, чтобы проверить, не является ли переменная не нулевой, а не нулевой

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

Есть ли лучший способ сделать это?

Ответ 1

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

Ответ 2

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

Остерегайтесь обычных отказов... великой силы/ответственности, патчей обезьян, ведущих к темной стороне и т.д.

Ответ 3

хорошо, через 5 лет прошло....

if discount.try :nonzero?
  ...
end

Важно отметить, что try определен в геме ActiveSupport, поэтому он недоступен в обычном ruby.

Ответ 4

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

Ответ 5

Начиная с Ruby 2.3.0, вы можете объединить безопасный навигационный оператор (&.) с Numeric#nonzero?. &. возвращает nil, если экземпляр был nil и nonzero? - если число было 0:

if discount&.nonzero?
  # ...
end

Или постфикс:

do_something if discount&.nonzero?

Ответ 6

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

Ответ 7

Вы можете сделать это:

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

Порядок здесь важен, потому что если discount есть nil, то он не будет иметь метод zero?. Оценка короткого замыкания Ruby не должна пытаться оценить discount.zero?, однако, если discount - nil.

Ответ 8

Вы можете преобразовать свою пустую строку в целочисленное значение и проверить нуль?.

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

Ответ 9

if discount and discount != 0
  ..
end

он будет false для discount = false

Ответ 10

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

Если мы пройдем "", он вернет false, а пробел? возвращает true. То же самое происходит, когда data = false пустой? возвращает true для nil, false, empty или whitespace string. Так лучше использовать пробел? метод, чтобы избежать пустой строки.

Ответ 11

Вы можете использовать метод NilClass #to_i, который будет возвращать ноль для значений nil:

unless discount.to_i.zero?
  # Code here
end

Если discount может быть дробным числом, вы можете вместо этого использовать #to_f, чтобы исключить округление числа до нуля.

Ответ 12

При работе с записью базы данных мне нравится инициализировать все пустые значения с помощью 0, используя помощник миграции:

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

Ответ 13

Вы можете инициализировать скидку до 0 до тех пор, пока ваш код не будет использоваться и не будет использоваться до его инициализации. Я бы не подумал ни о чем другом. Я бы не подумал ни о чем другом.

Ответ 14

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

Ответ 15

Альтернативное решение - использовать уточнения, например:

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

Ответ 16

Я считаю, что для кода Ruby достаточно хорошего качества. Я не думаю, что могу написать unit test, который показывает разницу между этим и оригиналом.

if discount != 0
end