2012-08-28 3 views
3

У меня есть повторное сравнение, в котором я должен проверить, равны ли три переменные определенной переменной. Для простоты я создам сценарий, который иллюстрирует проблему, которую я испытываю.'DRY'ing мой синтаксис Ruby

if time == -1 and day_of_week == -1 and month == -1 

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

Сейчас я использую обходной способ сделать это следующим образом:

all_equal = true 
[time_now, day_of_week, month].each { |value| all_equal = false if value != -1 } 
if all_equal .... 

Х, очевидно, это довольно поверх (и явно менее эффективны), но я считаю отсутствие повторения более приятно посмотри на.

Вы порекомендовали бы лучший подход к этому?

Спасибо!

+0

в стороне от менее читаемых, вашей второй версии уступает, потому что она не позволяет оценить короткое замыкание. – RoundTower

ответ

6

Использование Enumerable#all?:

if [time_now, day_of_week, month].all? { |value| value == -1 } 
    # do something 
end 
+0

Создайте благодарность. Сначала искал метод «все», но, наверное, я просмотрел это! – Vivek

+1

Дело в том, что многие методы, которые вы могли бы использовать для работы с массивами, также работают с другими перечисляемыми типами, поэтому я всегда должен заглядывать в * Enquableable docs в любом случае. Этот модуль обеспечивает много интересных функций для любого типа, который определяет метод '# each'. Это очень здорово! –

+0

Удивительно, что я использовал Ruby так долго, но на самом деле не нашел времени, чтобы изучить все интересные причуды об этом, как Enumerable. Еще раз спасибо! – Vivek