2012-11-09 4 views
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

마지막 매개 변수 앞에 &을 추가하면 메서드 호출과 함께 사용되는 블록에 바인딩된다는 것을 의미하며 람다를 매개 변수로 전달하려고합니다.

은 그냥 ( def SumEachBy(collec, lamb))을 제거하고 람다 :

+0

이렇게하면, NoMethodError : 정의되지 않은 메쏘드 'lamb'for main : Object' 행의'collec.each' – Kache

+0

'lamb [x]'와 같이 대괄호로 lambdas를 호출해야합니다. 감사! – Kache

+0

... 또는 lamb.call (x) :) 환영합니다. – Anton

-1

나는 구멍 코드에 대해 잘 모릅니다하지만 유 주입 사용하여 합계 부분을 업데이트 할 수 있습니다

def SumEachBy(collec, lamb) 
    collection.inject(0) { |sum, value| sum += value } 
end 
내가 모든 코드를 이해할 수

, 무엇 u는 여기에 달성하고자합니까?

안동 제안에 따라 답변을 편집합니다. =)

+0

개편 내 코드와 나중에 개선 된 변수 이름을 즐길 수 있습니다. – Kache

+0

@Kache 그것은 무례합니다. 여기서 답은 ** 당신 **, OP입니다. 질문을 향상 시키면, 그것은 ** 당신이 ** 더 나은 결과를 얻으려는 목적을위한 것입니다. 다른 방향으로 가져 가지 마십시오. 변수 이름과 관련해서는 좋지 않습니다. Ruby에서 변수에 낙타 케이스를 사용하는 것은 좋은 습관이 아닙니다. – sawa

+0

@sawa 글쎄, 네가 새로운 활동을한지 3 시간이 지났기 때문에 돌아 오는 것이 좋다고 생각한다. 사실 나는 나쁜 이름 짓기에 얼마나 무례한 짓을했는지 지적하고 싶다. 또한, 나는 루비 초보자 (관습에 대해 알지 못한다는 뜻임)를 지적했지만, 누군가 (당신)는 내 게시물에서 그것을 편집하기로 결정했습니다. 그리고 아니, 이것은 나를위한 것이 아닙니다. 나중에 또 다른 초보자가 올 수 있습니다. Ruby를 처음 사용하는 동안 식별 할 수 없었던 단순한 구문 오류였습니다. – Kache

관련 문제