Лучшая рубиновая идиома для "ноль или ноль

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

if (!val || val == 0)
  # Is nil or zero
end

Но это кажется 9X_ruby очень неуклюжим.

85
1

  • Что должно произойти, если val равно `false`?<p ...
12
Общее количество ответов: 12

Ответ #1

Ответ на вопрос: Лучшая рубиновая идиома для "ноль или ноль

У объектов есть nil? method.

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

Или для одной инструкции:

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

9X_gang-of-four

72
4

  • Приоритет `или` здесь не требует наличия скобок и будет совершенно естественно прочитан опытны ...

Ответ #2

Ответ на вопрос: Лучшая рубиновая идиома для "ноль или ноль

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

unless val&.nonzero?
  # Is nil or zero
end

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

do_something unless val&.nonzero?

41
2

  • Очень кратко, но без комментария мне по ...

Ответ #3

Ответ на вопрос: Лучшая рубиновая идиома для "ноль или ноль

Если вам действительно нравятся названия 9X_design-patterns методов со знаками вопроса в конце:


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

Ваше 9X_idioms решение в порядке, как и некоторые другие 9X_design-patterns решения.

Ruby может заставить вас искать 9X_gang-of-four изящный способ сделать все, если вы не будете 9X_nulls осторожны.

37
0

Ответ #4

Ответ на вопрос: Лучшая рубиновая идиома для "ноль или ноль

Во-первых, я думаю, что это наиболее краткий 9X_patterns способ проверить это конкретное состояние.

Во-вторых, для 9X_gof меня это запах кода, который указывает на 9X_pattern потенциальную ошибку в вашем дизайне. Обычно 9X_pattern ноль и ноль не должны означать одно и то 9X_null же. Если возможно, вам следует попытаться 9X_nulls исключить возможность того, что val будет 9X_design-patterns равно нулю, прежде чем вы нажмете этот код, либо 9X_idiom проверив это в начале метода, либо каким-либо 9X_design-pattern другим механизмом.

У вас может быть вполне 9X_gof законная причина для этого, и в этом случае 9X_design-pattern я думаю, что ваш код хорош, но я бы по крайней 9X_idiom мере подумал о том, чтобы попытаться избавиться 9X_idiom от проверки на ноль, если это возможно.

30
1

  • Совершенно верно насчет запаха кода! +1 Можно рассмотреть возможност ...

Ответ #5

Ответ на вопрос: Лучшая рубиновая идиома для "ноль или ноль

Вы можете использовать Object.nil? специально 9X_patterns для проверки на ноль (и не попадать в ловушку 9X_design-pattern между ложным и нулевым). Вы также можете 9X_null исправить метод в Object.

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

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

Это не рекомендуется, поскольку 9X_gof коллегам сложно отслеживать изменения в 9X_idiom Object, и это может сделать ваш код непредсказуемым 9X_idioms для других.

9
1

  • epochwolf, если вы поместите это в класс Numeric, то `nil?` всегда будет возвращать false. `nil?` возвращает tr ...

Ответ #6

Ответ на вопрос: Лучшая рубиновая идиома для "ноль или ноль

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

val.to_i.zero?

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

8
0

Ответ #7

Ответ на вопрос: Лучшая рубиновая идиома для "ноль или ноль

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

Лучшее, что я могу придумать 9X_gang-of-four прямо сейчас, - это

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

Что, конечно, не очень 9X_nulls умно, но (очень) понятно.

4
0

Ответ #8

Ответ на вопрос: Лучшая рубиновая идиома для "ноль или ноль

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

module Nothingness
  refine Numeric do
    alias_method :nothing?, :zero?
  end

  refine NilClass do
    alias_method :nothing?, :nil?
  end
end

using Nothingness

if val.nothing?
  # Do something
end

4
0

Ответ #9

Ответ на вопрос: Лучшая рубиновая идиома для "ноль или ноль

Кратко и ясно

[0, nil].include?(val)

9X_ruby

3
2

  • Также можно отменить это: `val.in? [0, ноль] `<p><span c ...

Ответ #10

Ответ на вопрос: Лучшая рубиновая идиома для "ноль или ноль

Самый короткий и лучший путь должен быть

if val&.>(0)
  # do something
end

Для 9X_ruby val&.>(0) он возвращает nil, когда val равен нулю, поскольку 9X_idiom > в основном также является методом, nil 9X_patterns равен false в ruby. Он возвращает false, когда 9X_patterns val == 0.

3
1

  • Кратчайший по чему? Лучший способ, чем что?<p> ...

Ответ #11

Ответ на вопрос: Лучшая рубиновая идиома для "ноль или ноль

Rails делает это с помощью методов запроса 9X_patterns атрибутов, где, помимо false и nil, 0 и 9X_idioms "" также оцениваются как false.

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

Однако 9X_ruby у него есть и недоброжелатели. http://www.joegrossberg.com/archives/002995.html

2
0

Ответ #12

Ответ на вопрос: Лучшая рубиновая идиома для "ноль или ноль

Чтобы быть как можно более идиоматичным, я 9X_patterns предлагаю следующее.

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

Потому что:

  • Используется ноль? метод.
  • Он использует оператор "или", который предпочтительнее ||.
  • Здесь не используются круглые скобки, которые в данном случае не нужны. Скобки следует использовать только тогда, когда они служат какой-либо цели, например, для отмены приоритета определенных операторов.

2
1

  • Хотя я знаю, что это буквально 7 лет назад, я про ...