정수 배열이 있습니다.
예를 들면 다음과 같습니다.
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의 경우 sum
Enumerables에서 사용할 수 있습니다 .
[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)
답변
다양성을 위해 배열이 숫자 배열이 아니라 숫자 (예 : 양) 속성을 가진 객체 배열 인 경우 에도이 작업을 수행 할 수 있습니다.
array.inject(0){|sum,x| sum + x.amount}