[ruby] 루비에서 숫자 배열을 합산하는 방법?

정수 배열이 있습니다.

예를 들면 다음과 같습니다.

array = [123,321,12389]

그것들의 합계를 얻는 좋은 방법이 있습니까?

알아요

sum = 0
array.each { |a| sum+=a }

작동 할 것이다.



답변

이 시도:

array.inject(0){|sum,x| sum + x }

루비의 열거 가능한 문서를보십시오

(참고 : 0기본 사례는 필요하기 때문에 0빈 배열에 대신 반환됩니다 nil)


답변

또는 Ruby 1.9 방식으로 시도하십시오.

array.inject(0, :+)

참고 : 0기본 사례가 필요 nil하면 빈 배열에 반환됩니다.

> [].inject(:+)
nil
> [].inject(0, :+)
0


답변

array.reduce(0, :+)

반면에 Reducearray.inject(0, :+) 라는 용어 는 MapReduce 프로그래밍 모델 의 등장과 함께보다 일반적인 용어가되었습니다 .

주입 , 축소 , 접기 , 누적압축 은 모두 접기 기능 클래스와 동의어 입니다. 코드 기반에서 일관성이 가장 중요하지만 다양한 커뮤니티가 한 단어를 다른 단어보다 선호하는 경향이 있기 때문에 대안을 아는 것이 유용합니다.

map-reduce ververage를 강조하기 위해, 그 배열에서 끝나는 것을 조금 더 용서하는 버전이 있습니다.

array.map(&:to_i).reduce(0, :+)

추가적인 관련 자료 :


답변

Rails가 설치되어있는 경우 (비교를 위해) (실제로는 ActiveSupport 만) :

require 'activesupport'
array.sum


답변

Ruby> = 2.4.0의 경우 sumEnumerables에서 사용할 수 있습니다 .

[1, 2, 3, 4].sum

기본 클래스를 mokeypatch하는 것은 위험합니다. 위험을 좋아하고 이전 버전의 Ruby를 사용하는 #sum경우 Array클래스에 추가 할 수 있습니다 .

class Array
  def sum
    inject(0) { |sum, x| sum + x }
  end
end


답변

Ruby 2.4.0의 새로운 기능

적절하게 이름이 지정된 method를 사용할 수 있습니다 Enumerable#sum. 그것은 많은 장점이 있습니다inject(:+) 있지만 마지막에 읽을 중요한 메모가 있습니다.

범위

(1..100).sum
#=> 5050

배열

[1, 2, 4, 9, 2, 3].sum
#=> 21

[1.9, 6.3, 20.3, 49.2].sum
#=> 77.7

중요 사항

이 방법은와 동일하지 않습니다 #inject(:+). 예를 들어

%w(a b c).inject(:+)
#=> "abc"
%w(a b c).sum
#=> TypeError: String can't be coerced into Integer

또한,

(1..1000000000).sum
#=> 500000000500000000 (execution time: less than 1s)
(1..1000000000).inject(:+)
#=> 500000000500000000 (execution time: upwards of a minute)

이런지에 대한 자세한 내용 은 이 답변 을 참조하십시오 sum.


답변

다양성을 위해 배열이 숫자 배열이 아니라 숫자 (예 : 양) 속성을 가진 객체 배열 인 경우 에도이 작업을 수행 할 수 있습니다.

array.inject(0){|sum,x| sum + x.amount}