Рубин: Метапрограммирование в условном предложении - PullRequest
3 голосов
/ 07 марта 2012

У меня есть очень повторяющееся условное предложение .Мне было интересно, можно ли убрать немного метапрограммирования .

Это упрощенный пример того, с чем я имею дело:

FILTERS = [
  :filter1,
  :filter2,
  :filter3
]

def filter1; true; end
def filter2; true; end
def filter3; true; end

if(
  send( FILTERS[0] ) &&
  send( FILTERS[1] ) &&
  send( FILTERS[2] )
)
  puts "DONE!"
end

(Вв моем реальном случае массив FILTERS содержит 27 элементов)

Цель состоит в том, чтобы заменить три строки в предложении if какой-то автоматической итерациейчерез все методы фильтрации .

Другим важным соответствием является сохранение быстрого выхода команды &&: в случае, если filter1 равно false, ни filter2, ни filter3 не будут выполнены.

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

1 Ответ

7 голосов
/ 07 марта 2012
FILTERS.all? {|filter| send(filter) } and puts "DONE!"
...