如果我有下面这样的代码,我需要做什么才能让它工作?

config = {} #options for faster csv
input_file = "foo.csv"

# can be in any class or module
def count_item_groups(items)
    results = Hash.new(0)
    (items || []).each do |current|
        results[current.to_s] += 1
    end
    results
end

row_value_iterator = FasterCSV.foreach(input_file, config) do |row|
  yield return row[1]
end

result = count_item_groups(row_value_iterator)

与这样的代码相比
def do_it_all
    results = Hash.new(0)
    FasterCSV.foreach(input_file, config) do |row|
        results[row[1].to_s] += 1
    end
    results
end

结果应该是具有行[1]值的键的哈希。yield return >不存在于Ruby中,但我确信Ruby可以处理这种类型的代码。

最佳答案

这就是我所理解的你在问的:“我如何将一个像FasterCSV.foreach这样的方法转换成一个函数(产生值)以便模块化我的代码。”。
答:在Ruby中,您可以使用Object#enum_for将每个方法转换为枚举器对象现在您可以将count_item_groupsmap的输出一起使用,但我建议使用facets'Enumerable#frequency

results = FasterCSV.enum_for(:foreach, "file.csv", {}).map do |row|
  row[1].to_s
end.frequency
#=> {"val1"=>3, "val2"=>1}

09-30 15:05
查看更多