У меня есть очень повторяющееся условное предложение. Мне было интересно, можно ли очистить бит 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
массив находится здесь, чтобы помочь найти элегантный решение, вы не должны его использовать.
если filtersX содержит только булево значение, почему вы не храните его в хэш, фильтрует = {Filter1: истинное, Filter2: правда, фильтр3: ложный} и itterate над хэш? – lesce
не должны ли фильтры возвращать что-то? (так что один фильтр действует на выходе предыдущего). Или они работают, делая побочные эффекты? (например, Rails 'before_filters') – tokland
@lesce Реализации методов фильтра, показанные здесь, являются примерами _simplified_. Реальные более сложны. Любая реальная проблема заключается в том, как перебирать результаты, сохраняя поведение '&&', как разрешено @Tass. – fguillen