2013-11-22 4 views
0

В некоторых случаях мне приходилось писать довольно многословное утверждение if в некоторых рубиновых скриптах.Ruby Несколько И оценки для целочисленного значения

заявление будет выглядеть примерно так:

if long_var_name == 0 && very_different_name == 0 && other_third_var == 0 && additional_variable == 0 && name_five == 0 && longest_variable_name_six == 0 
    # (possibly even more conditions) 
    # do stuff here... 
end 

Похоже, там должно быть более элегантный способ сделать это.

Проблема в том, что if и and не совсем просты в изучении с помощью Google, как основных английских слов. Поэтому я пришел с пустыми руками.

Кто-нибудь знает способ сократить эту ситуацию? Это может стать кошмаром, чтобы читать, когда у вас их еще больше.

  • Иногда переменное переименование не является вариантом.
  • Имена иногда сильно отличаются.

Примечания: Я нашел умное решение для подобных ситуаций с ИЛИ:

Ruby Multiple OR Evaluations For String Value

+0

Не плохой вопрос ИМХО. Upvote;) –

+0

Спасибо. Я не хочу звучать хныкать, но я видел, что слишком много хороших вопросов других людей забито - я думаю, что те из нас, кто пытается ответить на многое, забывают о том, что у нас есть. (Я уверен, что я тоже виноват) (и всегда есть акулы) – Plasmarob

ответ

6

Если у вас есть массив и специально проверяли на ноль, вы можете сделать:

vars1 = [0,0,3,0,0] 
vars2 = [0,0,0,0,0] 

vars1.all?(&:zero?) # false 
vars2.all?(&:zero?) # true 

РЕДАКТИРОВАНИЕ: На основе добавленных условий OP, имеющих разные названия для значений:

if [long_var_name_1,long_var_name_2,long_var_name_3].all?(&:zero?) 
    # do stuff here... 
end 
+0

Это правильный ответ. –

+0

Это не отличается от подобных ответов, но мне нравится передавать 'Proc' на' all? '! Upvote. –

+0

Очень чистый, и прямо в точку. Благодарю вас и меня. – Plasmarob

1

В вашем конкретном случае, я хотел бы написать

if [a, b, c, d, e, f].all? { |var| var == 0 } 

Там же отметить неправ цепочки and условия ИМХО.

+0

Не существует серьезной проблемы с 'и'. Мне просто все равно, как это бесполезно. У меня когда-то было три строки. – Plasmarob

+1

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

+0

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

0

Вы можете использовать Enumerable#all? и Symbol#to_proc использование метода Fixnum#zero?.

foo = 0 
bar = 0 
baz = 0 

[foo, bar, baz].all? &:zero? 
# => true 

one = 1 
two = 2 

[foo, one, two].any? &:zero? 
#=> true 

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

owns_peanuts = ->(person){ person.inventory.contains :peanuts } 
[bill, david, mike].any? &owns_peanuts 
+0

уже ответил .. :) –

+1

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

1

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

grp_1_zero = var_1 == 0 && var_2 == 0 && var_3 == 0 
grp_2_zero = var_a == 0 && var_b == 0 && var_c == 0 
grp_3_zero = var_z == 0 && var_x == 0 && var_y == 0 

if grp_1_zero && grp_2_zero && grp_3_zero 
    #code here 
end 
+0

Это определенно стоит рассмотреть тоже. Мне может понадобиться это в какой-то момент. – Plasmarob

1

Другой, для массива a:

a == Array.new(a.size,0) 
+0

Нет необходимости создавать экземпляр целого другого массива, но да. Вы должны отредактировать это сообщение, включив тот факт, что это позволяет другие возможности. + Upvote! – Plasmarob

+0

Я не сторонник этого, просто подумал, что стоит упомянуть. 'Все? нуль? "- это, безусловно, путь. –

Смежные вопросы