如果我有下面这样的代码,我需要做什么才能让它工作?
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_groups
与map
的输出一起使用,但我建议使用facets'Enumerable#frequency:
results = FasterCSV.enum_for(:foreach, "file.csv", {}).map do |row|
row[1].to_s
end.frequency
#=> {"val1"=>3, "val2"=>1}