Как сложить массив чисел в Ruby? - PullRequest
546 голосов
/ 08 октября 2009

У меня есть массив целых чисел.

Например:

array = [123,321,12389]

Есть ли какой-нибудь хороший способ получить их сумму?

Я знаю, что

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

будет работать.

Ответы [ 22 ]

5 голосов
/ 14 июня 2018

Этого достаточно [1,2,3].inject('+')

4 голосов
/ 19 декабря 2016

Ruby 2.4.0 выпущен и имеет метод Enumerable # sum . Так что вы можете сделать

array.sum

Примеры из документов:

{ 1 => 10, 2 => 20 }.sum {|k, v| k * v }  #=> 50
(1..10).sum                               #=> 55
(1..10).sum {|v| v * 2 }                  #=> 110
3 голосов
/ 03 мая 2018

для массива с нулевыми значениями мы можем сделать сжатие и затем ввести сумму экс

a = [1,2,3,4,5,12,23.45,nil,23,nil]
puts a.compact.inject(:+)
3 голосов
/ 30 января 2011

Также допускается для [1,2].sum{|x| x * 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
2 голосов
/ 14 января 2017
array.reduce(:+)

Работает для Диапазоны тоже ... следовательно,

(1..10).reduce(:+) returns 55
1 голос
/ 27 ноября 2016

Если вы чувствуете гольф, вы можете сделать

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

Это создаст строку «123 + 321 + 12389», а затем с помощью функции eval сделает сумму. Это только для игры в гольф , вы не должны использовать его в правильном коде.

0 голосов
/ 07 июня 2019
number = [1..100]

number. each do |n|

    final_number = n.sum

    puts "The sum is #{final_number}"
end

* Это хорошо для меня, как нового разработчика. Вы можете настроить диапазон номеров, изменив значения в пределах []

0 голосов
/ 01 февраля 2018

Метод 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: Когда Array содержит nil и пустые значения, по умолчанию, если вы используете любые из вышеперечисленных функций, limit, sum, inject все будет через

TypeError: ноль не может быть приведен к Integer

Вы можете преодолеть это,

   [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

Оценивает выражения Ruby в строке.

  [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 голосов
/ 30 января 2018

Это самый короткий путь. Попробуй.

array.inject :+

0 голосов
/ 24 июня 2017

Или вы можете попробовать этот метод:

def sum arr
  0 if arr.empty
  arr.inject :+
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...