Проверка, является ли переменная не ноль и не ноль в ruby - PullRequest
229 голосов
/ 31 октября 2008

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

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

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

Ответы [ 16 ]

381 голосов
/ 31 октября 2008
unless discount.nil? || discount == 0
  # ...
end
40 голосов
/ 31 октября 2008
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

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

25 голосов
/ 16 ноября 2013

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

if discount.try :nonzero?
  ...
end

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

25 голосов
/ 31 октября 2008
unless [nil, 0].include?(discount) 
  # ...
end
19 голосов
/ 16 января 2016

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

if discount&.nonzero?
  # ...
end

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

do_something if discount&.nonzero?
16 голосов
/ 31 октября 2008
if (discount||0) != 0
  #...
end
13 голосов
/ 31 октября 2008

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

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

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

11 голосов
/ 26 сентября 2012

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

"".to_i.zero? => true
nil.to_i.zero? => true
3 голосов
/ 16 марта 2011
if discount and discount != 0
  ..
end

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

2 голосов
/ 06 апреля 2016
def is_nil_and_zero(data)
     data.blank? || data == 0 
end  

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...