2013-02-13 7 views
1

У меня есть следующий метод, который слишком долго:Передать объект в качестве аргумента

def combine_atoms 
    @left.each do |chemical| 
    chemical.chem_species.each do |atom| 
     if @left_total[atom[0]].nil? 
     @left_total[atom[0]] = atom[1] 
     else 
     @left_total[atom[0]] += atom[1] 
     end 
    end 
    end 

    @right.each do |chemical| 
    chemical.chem_species.each do |atom| 
     if @right_total[atom[0]].nil? 
     @right_total[atom[0]] = atom[1] 
     else 
     @right_total[atom[0]] += atom[1] 
     end 
    end 
    end 
end 

Как можно передать @left и @left_total в качестве аргументов, чтобы уменьшить количество строк кода в два раза, используя рубин ?

ответ

3

Вы можете отделить петлю от combine_atoms метода на новый с аргументами, как это:

def combine_atoms 
    @left_total = combine_part(@left, @left_total) 
    @right_total = combine_part(@right, @right_total) 
end 

def combine_part(part, total) 
    part.each do |chemical| 
    chemical.chem_species.each do |atom| 
     if total[atom[0]].nil? 
     total[atom[0]] = atom[1] 
     else 
     total[atom[0]] += atom[1] 
     end 
    end 
    end 
end 
Смежные вопросы