Лучшая рубиновая идиома для "ноль или ноль
Я ищу краткий способ проверить значение, чтобы 9X_null узнать, равно ли оно нулю или нулю. В настоящее 9X_null время я делаю что-то вроде:
if (!val || val == 0) # Is nil or zero end
Но это кажется 9X_ruby очень неуклюжим.
- Что должно произойти, если val равно `false`?<p ...
Ответ #1
Ответ на вопрос: Лучшая рубиновая идиома для "ноль или ноль
У объектов есть nil? method.
if val.nil? || val == 0 [do something] end
Или для одной инструкции:
[do something] if val.nil? || val == 0
9X_gang-of-four
- Приоритет `или` здесь не требует наличия скобок и будет совершенно естественно прочитан опытны ...
Ответ #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?
- Очень кратко, но без комментария мне по ...
Ответ #3
Ответ на вопрос: Лучшая рубиновая идиома для "ноль или ноль
Если вам действительно нравятся названия 9X_design-patterns методов со знаками вопроса в конце:
if val.nil? || val.zero? # do stuff end
Ваше 9X_idioms решение в порядке, как и некоторые другие 9X_design-patterns решения.
Ruby может заставить вас искать 9X_gang-of-four изящный способ сделать все, если вы не будете 9X_nulls осторожны.
Ответ #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 от проверки на ноль, если это возможно.
- Совершенно верно насчет запаха кода! +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 для других.
- epochwolf, если вы поместите это в класс Numeric, то `nil?` всегда будет возвращать false. `nil?` возвращает tr ...
Ответ #6
Ответ на вопрос: Лучшая рубиновая идиома для "ноль или ноль
nil.to_i возвращает ноль, поэтому я часто 9X_gof делаю это:
val.to_i.zero?
Однако вы получите исключение, если 9X_gof val когда-либо будет объектом, который не 9X_idioms отвечает_to #to_i.
Ответ #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 умно, но (очень) понятно.
Ответ #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
Ответ #9
Ответ на вопрос: Лучшая рубиновая идиома для "ноль или ноль
Кратко и ясно
[0, nil].include?(val)
9X_ruby
- Также можно отменить это: `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
.
- Кратчайший по чему? Лучший способ, чем что?<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
Ответ #12
Ответ на вопрос: Лучшая рубиновая идиома для "ноль или ноль
Чтобы быть как можно более идиоматичным, я 9X_patterns предлагаю следующее.
if val.nil? or val == 0 # Do something end
Потому что:
- Используется ноль? метод.
- Он использует оператор "или", который предпочтительнее ||.
- Здесь не используются круглые скобки, которые в данном случае не нужны. Скобки следует использовать только тогда, когда они служат какой-либо цели, например, для отмены приоритета определенных операторов.
- Хотя я знаю, что это буквально 7 лет назад, я про ...
-
7
-
11
-
6
-
3
-
5
-
4
-
7
-
9
-
41
-
13
-
38
-
33
-
14
-
6
-
23
-
8
-
11
-
15
-
31
-
9
-
9
-
6
-
15
-
5
-
3
-
11
-
7
-
3
-
4
-
8
-
4
-
5
-
6
-
8
-
3
-
4
-
1
-
3
-
3
-
3
-
3
-
6
-
2
-
7
-
1
-
7
-
2
-
2
-
3
-
2