Лучшая рубиновая идиома для “ноля или нуля”

76
задан JosephRuby 18 December 2011 в 09:33
поделиться

13 ответов

Объекты имеют ноль? метод .

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

Или, всего для одной инструкции:

[do something] if val.nil? || val == 0
68
ответ дан user513951 24 November 2019 в 11:12
поделиться
val ||= 0
if val == 0
# do something here
end
-3
ответ дан lmumar 24 November 2019 в 11:12
поделиться

Другое решение:

if val.to_i == 0
  # do stuff
end
-2
ответ дан Scott 24 November 2019 в 11:12
поделиться

Можно использовать case, если Вам нравится:

 case val with nil, 0
      # do stuff
 end

Затем можно использовать что-либо, что работает с ===, который иногда хорош. Или сделайте что-то вроде этого:

not_valid = nil, 0
case val1 with *not_valid
      # do stuff
 end
 #do other stuff
 case val2 with *not_valid, false    #Test for values that is nil, 0 or false
      # do other other stuff
 end

Это не точно хорошее ООП, но это очень гибко, и это работает. Мои if с обычно заканчиваются как case с так или иначе.

, Конечно Enum.any? / Enum.include? вид работ также..., если Вам нравится становиться действительно загадочными:

if [0, nil].include? val
    #do stuff
end

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

0
ответ дан 24 November 2019 в 11:12
поделиться

Я имею дело с этим путем определения, "?" метод, который я могу тогда реализовать по-другому на различных классах. Таким образом для Массива, "?" означает "размер> 0"; для Fixnum это означает "сам! = 0 дюймов; для Строки это означает "сам! =' '". NilClass, конечно, определяет, "?" как просто возврат ноля.

0
ответ дан glenn mcdonald 24 November 2019 в 11:12
поделиться

Чтобы быть максимально идиоматичным, я предложил бы это.

if val.nil? or val == 0
    # Do something
end

, поскольку:

  • Это использует ноль? метод.
  • Это использует "или" оператор, который предпочтителен для ||.
  • Это не использует круглые скобки, которые не необходимы в этом случае. Круглые скобки должны только использоваться, когда они служат некоторой цели, такой как переопределение приоритета определенных операторов.
2
ответ дан Joshua Swink 24 November 2019 в 11:12
поделиться

Я полагаю, что Ваш код является неправильным; это на самом деле протестирует на три значения: nil, false , и нуль. Это вызвано тем, что !val выражение верно для всех значений, которые являются ложью, которая в Ruby является nil и false.

лучшее, которое я могу придумать прямо сейчас,

if val == nil || val == 0
  # do stuff
end

, Который, конечно, не очень умен, но (очень) ясен.

4
ответ дан unwind 24 November 2019 в 11:12
поделиться

Направляющие делают это через методы запроса атрибута, где в дополнение ко лжи и нолю, 0 и "" также оценивают ко лжи.

if (model.attribute?) # => false if attribute is 0 and model is an ActiveRecord::Base derivation

Однако это имеет свою долю хулителей. http://www.joegrossberg.com/archives/002995.html

2
ответ дан Gishu 24 November 2019 в 11:12
поделиться

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

111-секундный, мне это - запах кода, который указывает на потенциальный дефект в Вашем дизайне. Обычно ноль и нуль не должны означать то же самое. Если возможный необходимо попытаться устранить возможность val быть нолем перед ударом этого кода, или путем проверки этого в начале метода или некоторого другого механизма.

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

29
ответ дан Mike Deck 24 November 2019 в 11:12
поделиться

Можно ли использовать Object.nil? протестировать на ноль конкретно (и не схвачены между ложью и нолем). Вы можете патч обезьяны метод в Объект также.

class Object
   def nil_or_zero?
     return (self.nil? or self == 0)
   end
end

my_object = MyClass.new
my_object.nil_or_zero?
==> false

Это не рекомендуется, поскольку изменения в Объекте трудные для коллег проследить и могут сделать Ваш код непредсказуемым другим.

9
ответ дан Adrian Dunston 24 November 2019 в 11:12
поделиться

Если Вам действительно нравятся имена методов с вопросительными знаками в конце:


if val.nil? || val.zero?
  # do stuff
end

Ваше решение прекрасно, как несколько из других решений.

Ruby может заставить Вас искать симпатичный способ сделать все, если Вы не осторожны.

32
ответ дан 24 November 2019 в 11:12
поделиться

nil.to_i возвращает ноль , поэтому я часто делаю это:

val.to_i.zero?

Однако вы получите исключение, если val когда-либо будет объектом, который не отвечает_to #to_i.

5
ответ дан 24 November 2019 в 11:12
поделиться

Мне очень нравится метод Rails blank? для такого рода вещей, но он не возвращает true для 0 . Таким образом, вы можете добавить свой метод:

def nil_zero? 
  if respond_to?(:zero?) 
    zero? 
  else 
    !self 
  end 
end 

И он проверит, является ли какое-то значение нулем или 0:

nil.nil_zero?
=> true
0.nil_zero?
=> true
10.nil_zero?
=> false

if val.nil_zero?
  #...
end
0
ответ дан 24 November 2019 в 11:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: