2012-07-05 6 views
0

나는 inject 메소드를 사용하여 Ruby의 배열에있는 객체의 속성을 합계 할 수 있다는 것을 알고 있습니다. 예를 들어, 나는 다음과 같은 사용하여 배열에있는 모든 에이전트의 현금 합계 수 :Ruby의 배열에있는 객체의 속성의 양수/음수 값을 합하는 방법

그러나
sum_of_cash = agents.inject(0) { |sum, e| sum + e.cash } 

, 어떻게 내가 속성의 양 또는 음의 값, 즉, 오직 양 또는 음의 현금 잔고 합계 수, 예를 들면?

내가 생각할 수있는 한 가지 방법은 배열에 대해 루프를 수행하고 값이 양수이면 if 함수를 사용하는 것이지만 가능한 경우 클리너 메서드를 찾고 있습니다.

감사합니다.

답변

4

이 같은 일이이라고 생각 더 우아한 조금

agents.map(&:cash).select { |c| c > 0 }.inject(&:+) 
+1

더 나은'주사 (0, +)' – tokland

+0

완벽한, 고맙습니다! –

0
내가 분사 내부 if 필요로하지 않는 두 가지 방법을 생각할 수

:

  1. 적절한 추가하기 메소드를 에이전트 객체에 추가합니다. 주입하기 전에

    sum_of_cash = agents.inject(0) { |sum, e| sum + e.positive_cash }

  2. 필터 : 그럼 당신은 다음과 같은 코드를 작성할 수

    sum_of_case = agents.map(&:cash).keep_if{|c| c > 0 }.reduce(&:+)

0
agents.select{|e| e.cash > 0}.inject(0) { |sum, e| sum + e.cash } 
+1

better :'sum + e' – tokland

+0

'keep_if'를 사용하면'agents'의 원래 내용을 파괴하고 있다는 것에주의하십시오. 더 나은 '선택'. – tokland

+0

댓글을 주셔서 감사합니다. – davidrac

관련 문제