Объекты имеют ноль? метод .
if val.nil? || val == 0
[do something]
end
Или, всего для одной инструкции:
[do something] if val.nil? || val == 0
val ||= 0
if val == 0
# do something here
end
Другое решение:
if val.to_i == 0
# do stuff
end
Можно использовать 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"; для Fixnum это означает "сам! = 0 дюймов; для Строки это означает "сам! =' '". NilClass, конечно, определяет, "?" как просто возврат ноля.
Чтобы быть максимально идиоматичным, я предложил бы это.
if val.nil? or val == 0
# Do something
end
, поскольку:
Я полагаю, что Ваш код является неправильным; это на самом деле протестирует на три значения: nil
, false
, и нуль. Это вызвано тем, что !val
выражение верно для всех значений, которые являются ложью, которая в Ruby является nil
и false
.
лучшее, которое я могу придумать прямо сейчас,
if val == nil || val == 0
# do stuff
end
, Который, конечно, не очень умен, но (очень) ясен.
Направляющие делают это через методы запроса атрибута, где в дополнение ко лжи и нолю, 0 и "" также оценивают ко лжи.
if (model.attribute?) # => false if attribute is 0 and model is an ActiveRecord::Base derivation
Однако это имеет свою долю хулителей. http://www.joegrossberg.com/archives/002995.html
Прежде всего я думаю, что это о самом кратком способе, которым можно проверить на то конкретное условие.
111-секундный, мне это - запах кода, который указывает на потенциальный дефект в Вашем дизайне. Обычно ноль и нуль не должны означать то же самое. Если возможный необходимо попытаться устранить возможность val быть нолем перед ударом этого кода, или путем проверки этого в начале метода или некоторого другого механизма.
у Вас могла бы быть совершенно законная причина сделать это, в этом случае, я думаю, что Ваш код хорош, но я, по крайней мере, рассмотрел бы попытку избавиться от нулевой проверки, если это возможно.
Можно ли использовать 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
Это не рекомендуется, поскольку изменения в Объекте трудные для коллег проследить и могут сделать Ваш код непредсказуемым другим.
Если Вам действительно нравятся имена методов с вопросительными знаками в конце:
if val.nil? || val.zero?
# do stuff
end
Ваше решение прекрасно, как несколько из других решений.
Ruby может заставить Вас искать симпатичный способ сделать все, если Вы не осторожны.
nil.to_i возвращает ноль , поэтому я часто делаю это:
val.to_i.zero?
Однако вы получите исключение, если val когда-либо будет объектом, который не отвечает_to #to_i.
Мне очень нравится метод 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