1

次のようなコードがある場合、それを機能させるにはどうすればよいですか?

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

結果は、row[1] 値のキーを持つハッシュになります。yield returnRubyには存在しませんが、Rubyはこのタイプのコードを処理できると確信しています.

4

2 に答える 2

4

FasterCSV.foreach「コードをモジュール化できるように、(副作用を行うことによって)命令的に機能するようなメソッドを機能的なもの(値を生成する)に変換するにはどうすればよいですか」.

回答: Ruby では、メソッドをObject#enum_forを使用してEnumeratorオブジェクトに変換できます。の出力でyour を使用できるようになりましたが、Facets のEnumerable#frequencyを使用することをお勧めします。count_item_groupsmap

results = FasterCSV.enum_for(:foreach, "file.csv", {}).map do |row|
  row[1].to_s
end.frequency
#=> {"val1"=>3, "val2"=>1}
于 2012-07-03T08:09:30.677 に答える
0

あなたが何を求めているのかわかりません。連鎖可能な機能に関連していると思います。

オブジェクト イテレータを別のイテレータにパラメータとして渡す代わりに、Ruby ではこれらのイテレータを連鎖させることができます。こんな感じかも。

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

result = row_value_iterator.each_with_object(Hash.new(0)) do |current,results|
  results[current.to_s] += 1
end

または、真のチェーン スタイルで実行します。

result = FasterCSV.foreach(input_file,config).each_with_object(Hash.new(0)) do |row,results|
  results[row[1].to_s] += 1
end
于 2012-07-03T01:56:47.740 に答える