Ruby에서 숫자 배열을 합산하는 방법은 무엇입니까?

정수 배열이 있습니다.

예를 들어

array = [123,321,12389]

이 둘의 합계를 구하는 좋은 방법이 있나요?

알아요, 그

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

가 효과가 있을 거라고요.

질문에 대한 의견 (4)

또는 Ruby 1.9 방식을 사용해 보세요:

array.inject(0, :+)

참고: 0 대소문자가 필요하며, 그렇지 않으면 빈 배열에서 nil이 반환됩니다:

> [].inject(:+)
nil
> [].inject(0, :+)
0
해설 (9)
해결책

이렇게 해보세요:

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

루비의 열거 가능한 문서 참조

(참고: nil 대신 빈 배열에 0이 반환되도록 0 대소문자가 필요합니다).

해설 (7)
array.reduce(0, :+)

같은 기간 동안 라이스잉젝트 (0, :+) ',' 를 입력하면 절감하십시오 는 보다 일반적인 대중 작용하고 있는 MapReduce 프로그래밍 모델을.

        • , , , 절감하십시오 투입, 배 위에 압축 및 [접이식 총괄하였습니다] [2] 모두 클래스로 가치가 있다. 내가 찾을 수 있지만, 다양한 사회 전반에 걸쳐 가장 중요한 정합성의 코드를 기반으로 한 단어 선호하는 경향이 있기 때문에 다른 대안을 알고 있는 데 비해 조롱이라면 남겼다.

강조하기 위해 매핑해야 줄일 수 있습니다. 문장, 여기 있는 이 버전에 따라 조금 더 관대하시며 motor1.1end 백업하도록 어레이입니다.

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

일부 추가 관련 판독값:

내가 메서드로부터 투입 .3/enumerable.html - http://ruby-doc.org/core-1.9

[2]: http://en.wikipedia.org/wiki/Reduce_% 28higher-order_function% 29

해설 (4)

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

require 'activesupport'
array.sum
해설 (3)

루비 &gt 위한 '합' 에서 사용할 수 있습니다. = 2.4.0 열거.

[1, 2, 3, 4].sum

것은 위험하다고 모키파치 기본 클래스. 이전 버전의 사용하여 같은 경우 위험을 루비, '# 합' 을 '클래스' 어레이입니다 추가할 수 있다.

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

의 새로운 2.4.0 루비

합 '방법' 이라는 열거 적절하게 사용할 수 있습니다. 이 회사는 많은 비해 '투입 (:+)' 수축됐는데 몇 가지 중요한 정보를 읽을 수 끝에 잘 알려져 있다.

사례

범위

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

어레이에는

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

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

중요

이 방법을 사용할 수 없습니다 (:+) '와' # 했다. 예를 들어

%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)

[이 오토메이티드] 참조 (https://stackoverflow.com/a/41449844/5021321) 이 같은 이유에 대한 자세한 정보는 '숨' 은 (는).

해설 (0)

루비 2.4+ 라이.섬 '즉' - '/ 레일 [1, 2, 3] 이섬 # = &gt. 6 '

루비 (:+) '또는' - '사전 2.4 라이스잉젝트 라이트러더스 (:+)'

  • 참고: 이 방법은 '# 합' 새로 추가된 2.4 "에 대한 열거 '그래서 이제' 루비 '를 이용할 수 있을 뿐만 아니라 라이.섬 순결케 않는다.
해설 (2)

그냥 다이버시티는 생각해서라도 할 수도 있습니다 없는 경우 이 어레이입니다 배열입니다 배열입니다 객체에는 않는비즈니스 속성을 가질 수 있는 것이 아니라, 숫자 숫자 (예, 금액):

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

루비 1.8.7 방법은 다음과 같습니다.

array.inject(0, &:+) 
해설 (2)

간단히 사용할 수 있습니다.

6 127 {{{000}}}

해설 (4)

이 정도면 콜린젝트 (& # 39, +& # 39;) '' [1.2,3]

해설 (0)

루비 2.4.0 는 릴리즈됨 또한 [ui_policytable_java_spe_policy 열거 # 합] [1] 메서드입니다. 할 수 있도록

array.sum

예) 의 문서:

{ 1 => 10, 2 => 20 }.sum {|k, v| k * v }  #=> 50
(1..10).sum                               #=> 55
(1..10).sum {|v| v * 2 }                  #=> 110

[1]: # 내가 혹시 방법 .0/enumerable.html http://ruby-doc.org/core-2.4

해설 (0)

우리가 할 수 있는 값을 모두 합쳐 모두 함께 어레이용 컴팩트형 그리곤요 투입 ex -

a = [1,2,3,4,5,12,23.45,nil,23,nil]
puts a.compact.inject(:+)
해설 (0)
  • 2} {x x 도 허용합니다 ' [1.2] 이섬 = 6':
# http://madeofcode.com/posts/74-ruby-core-extension-array-sum
class Array
  def sum(method = nil, &block)
    if block_given?
      raise ArgumentError, "You cannot pass a block and a method!" if method
      inject(0) { |sum, i| sum + yield(i) }
    elsif method
      inject(0) { |sum, i| sum + i.send(method) }
    else
      inject(0) { |sum, i| sum + i }
    end
  end
end
해설 (0)
array.reduce(:+)
    • 범위를 사용할 수 없다. 따라서
(1..10).reduce(:+) returns 55
해설 (1)

골피 느낄 경우, 할 수

eval([123,321,12389]*?+)

이렇게 하면 123+321+12389&quot 문자열을 만드는 "; eval 함수를 사용하여 할 다음 합. 이는 골프 , 대해서만 목적을 제대로 된 코드를 사용하면 안 됩니다.

해설 (0)
  • 메서드입니다 1:*
    [1] pry(main)> [1,2,3,4].sum
    => 10
    [2] pry(main)> [].sum
    => 0
    [3] pry(main)> [1,2,3,5,nil].sum
    TypeError: nil can't be coerced into Integer
  • 메서드입니다 2:*
   [24] pry(main)> [].inject(:+)
   => nil
   [25] pry(main)> [].inject(0, :+)
   => 0
   [4] pry(main)> [1,2,3,4,5].inject(0, :+)
   => 15
   [5] pry(main)> [1,2,3,4,nil].inject(0, :+)
   TypeError: nil can't be coerced into Integer
   from (pry):5:in `+'
  • 메서드입니다 3:*
   [6] pry(main)> [1,2,3].reduce(:+)
   => 6
   [9] pry(main)> [].reduce(:+)
   => nil
   [7] pry(main)> [1,2,nil].reduce(:+)
   TypeError: nil can't be coerced into Integer
   from (pry):7:in `+'
  • 메서드입니다 4:* 어레이입니다 때 모두 포함된 모든 기능을 사용할 경우 기본적으로 및 빈 값뿐만 절감하십시오 투입, sum, 위의 모든 작업을 통해

&gt. TypeError: # 39 로, t be 강압 can& 모두 정수

이를 극복할 수 있습니다,

   [16] pry(main)> sum = 0 
   => 0
   [17] pry(main)> [1,2,3,4,nil, ''].each{|a| sum+= a.to_i }
   => [1, 2, 3, 4, nil, ""]
   [18] pry(main)> sum
   => 10
  • 메서드입니다 6:*
    • eval

루비 (s) 의 전체 표현식에서는 구체화하십시오.

  [26] pry(main)> a = [1,3,4,5]
  => [1, 3, 4, 5]
  [27] pry(main)> eval a.join '+'
  => 13
  [30] pry(main)> a = [1,3,4,5, nil]
  => [1, 3, 4, 5, nil]
  [31] pry(main)> eval a.join '+'
  SyntaxError: (eval):1: syntax error, unexpected end-of-input
  1+3+4+5+
해설 (0)

우리가 할 수 있는 3 가지 방법 모두 어레이입니다

1)}, {합 + x 'x' 라이스잉젝트 합 (0)

  1. '라이스잉젝트 (& # 39, +& # 39;)'

  2. '아리스타인 (& # 39, +& # 39;)'

해설 (0)

또는 이 방법을 시도해 볼 수 있습니다.

def sum arr
  0 if arr.empty
  arr.inject :+
end
해설 (0)

이것은 아주 짧은 시간 동안 것입니다. 발라봐

'라이스잉젝트 :+'

해설 (0)