2010-02-18 2 views
2

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

def to_proc 
    levels_of_nesting = @fields.zip(@orderings) 

    procedure = nil 
    levels_of_nesting.each do |field, ordering| 
     procedure = proc_for(field, ordering) and next if procedure.nil? 
     procedure = procedure.decorate_w_secondary_sorting_level(proc_for(field, ordering)) 
    end 
    procedure 
    end 
+0

Если первый вызов proc_for (строка 6) возвращает nil, то строка 7 взрывается. Должен ли 'и следующий' быть' или следующим'? –

+0

отлично работает на моем компьютере. Я использую 1.9 –

ответ

3

Я бы использовал карту, чтобы запустить все через proc_for, а затем объединить procs с помощью инъекции.

def to_proc 
    @fields.zip(@orderings).map do |field, ordering| 
    proc_for(field, ordering) 
    end.inject do |prev,curr| 
    prev.decorate_w_secondary_sorting_level curr 
    end 
end 

Это делает методы итератора управлением потоком для вас, избегая ложных нулей и утверждений if.

+0

Ahhh очень приятно. Спасибо. –

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