2012-02-10 1 views
3

여기는 루비 마법사가 사용하기 쉽습니다. 주사에 문제가 있습니다. 이것은 간단합니다 :삽입시 정수형 심볼에 대한 심볼

a = Resource.all 
a.inject({ :wood => 0 }) { |res, el| res[:wood] + el.cost(1)[:wood] } 
TypeError: can't convert Symbol into Integer 

a는이 컬렉션의 모든 목재 자원의 합계를 만들고 싶습니다. el.cost (1) [: wood]는 잘 작동하고 정수 (자원 값)를 얻습니다. 이 부분은 정확합니다. 그것은 : 나무 기호와 함께 내 새 해시를 초기화하고 각 반복에 그 값을 설정하는 문제가있는 것 같아요,하지만 난 정말 문제를 찾을 수 없습니다.

아이디어가 있으십니까? 이런

답변

5

inject 방법 :

  1. 인출 초기화 값은,리스트의 첫번째 요소 람다로 전달한다. 람다 결과를 새로운 누적기로 사용하십시오.
  2. 은 새 누적 기가 목록의 다음 요소와 함께 람다에 전달됩니다. ... 새로운 축적
  3. 등등으로 람다의

을 결과를 사용하는 것은 그래서 당신은 람다에서해야 할 것입니다 :

  1. res에 해시를 가져 가라.
  2. 수정하십시오.
  3. 해시를 반환합니다.

2와 3을 수행하지 않으면 코드가 작동하지 않습니다. 다음을 시도하십시오.

a.inject({ :wood => 0 }) { |res, el| res[:wood] += el.cost(1)[:wood]; res } 

이것은 약간 중복됩니다. 정수를 먼저 누적 한 다음 해시를 만들 수 있습니다.

{ :wood => a.map { |el| el.cost(1)[:wood] }.reduce(0, :+) } 
+0

daaamn 해시를 반환해야한다는 것을 알고 있습니다. 예. 추가하지 않았습니다. 고맙습니다! – Spyros

+0

@ SpyrosP : 도와 줘서 기쁩니다. 다른 코드 스 니펫을 추가했습니다. 아마도이 흥미로운 것을 발견 할 것입니다. –