1

ラムダを渡して、セットのコレクション内のアイテムの値を合計しようとしています。これは単なる構文エラーだと思います:

# inputs
setCosts = {["A"] => 3, ["B"] => 4, ["A", "B"] => 5 }
collectionOfSets= [[["A"], ["B"]], [["A"], ["A", "B"]]]
# method and lambda
getSetCost = ->(x) { setCosts[x] }
def SumEachBy(collec, &lamb)    # stack trace starts here
    sum = 0
    collec.each { |x| sum += lamb(x) }
    return sum
end
# process output
collecValues = Hash[collectionOfSets.map { |set| [set, SumEachBy(set, getSetCost)] }]

私は得ています:

ArgumentError: wrong number of arguments (2 for 1)

私は期待collecValuesしています:

{[["A"], ["B"]] => 7, [["A"], ["A", "B"]] => 8}

私のエラーはどこですか?

ところで、Ruby でこれを行うより良い方法があれば、それも教えてください。

4

2 に答える 2

4

最後のパラメーターの前に追加&すると、メソッド呼び出しとともに使用されるブロックにバインドされ、ラムダをパラメーターとして渡します。

それを削除して(def SumEachBy(collec, lamb))、ラムダを楽しんでください:)

于 2012-11-09T02:13:05.847 に答える
-1

ホールコードについてはわかりませんが、injectを使用して合計部分を更新できます。

def SumEachBy(collec, lamb) 
  collection.inject(0) { |sum, value| sum += value }
end

私はあなたのコードをまったく理解できました、あなたはここで何を達成したいですか?

私はアントンの提案に従って答えを編集します。=)

于 2012-11-09T02:09:32.730 に答える