1

尝试通过传递 lambda 对集合中的项目值求和。我认为这只是一些语法错误:

# 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

在最后一个参数之前添加&意味着它将绑定到与方法调用一起使用的块,并且您希望将 lambda 作为参数传递。

只需删除它 ( def SumEachBy(collec, lamb)) 并享受您的 lambda :)

于 2012-11-09T02:13:05.847 回答
-1

我不知道孔代码,但您可以使用注入更新总和部分:

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

我完全可以理解你的代码,你想在这里实现什么?

我按照安东的建议编辑答案。=)

于 2012-11-09T02:09:32.730 回答