2012-03-07 2 views
2

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

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

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 массив находится здесь, чтобы помочь найти элегантный решение, вы не должны его использовать.

+0

если filtersX содержит только булево значение, почему вы не храните его в хэш, фильтрует = {Filter1: истинное, Filter2: правда, фильтр3: ложный} и itterate над хэш? – lesce

+0

не должны ли фильтры возвращать что-то? (так что один фильтр действует на выходе предыдущего). Или они работают, делая побочные эффекты? (например, Rails 'before_filters') – tokland

+0

@lesce Реализации методов фильтра, показанные здесь, являются примерами _simplified_. Реальные более сложны. Любая реальная проблема заключается в том, как перебирать результаты, сохраняя поведение '&&', как разрешено @Tass. – fguillen

ответ

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