2013-02-13 127 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作为参数,使用Ruby减少一半的代码行数?

回答

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