传递一个对象作为参数

时间:2013-02-13 07:37:43

标签: ruby arguments

我有以下方法太长:

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将代码行数减少一半?

1 个答案:

答案 0 :(得分: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