626 Stimmen

Wie summiert man ein Array von Zahlen in Ruby?

Ich habe ein Array mit ganzen Zahlen.

Zum Beispiel:

array = [123,321,12389]

Gibt es eine gute Möglichkeit, die Summe dieser Werte zu ermitteln?

Ich weiß, dass

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

funktionieren würde.

40 Stimmen

Bitte beachten Sie, dass Ruby 2.4+ die array.sum

1 Stimmen

Ruby 2.6 hat das nicht. Ruby gibt, Ruby nimmt, so scheint es.

2 Stimmen

@Lori hmm? Link

4voto

grosser Punkte 14107

Ermöglicht auch [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

4voto

thedudecodes Punkte 1409

Für Arrays mit Nullwerten können wir kompakt machen und dann die Summe einspeisen ex-

a = [1,2,3,4,5,12,23.45,nil,23,nil]
puts a.compact.inject(:+)

2voto

Nataraja B Punkte 655

Methode 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

Methode 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 `+'

Methode 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 `+'

Methode 4: Wenn Array eine Null und leere Werte enthält, wird standardmäßig, wenn Sie eine der oben genannten Funktionen reduce, sum, inject verwenden, alles durch den

TypeError: nil kann nicht in Integer umgewandelt werden

Sie können dies überwinden, indem Sie,

   [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

Methode 6: eval

Wertet den/die Ruby-Ausdruck(e) in String aus.

  [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+

1voto

Ulysse BN Punkte 8260

Wenn Sie sich golferisch fühlen, können Sie

eval [123,321,12389]*?+

Dadurch wird eine Zeichenkette "123+321+12389" erstellt und dann die Funktion eval verwendet, um die Summe zu bilden. Dies ist nur für Golfzwecke sollten Sie es nicht in richtigem Code verwenden.

-1voto

Prabhakar Undurthi Punkte 6202

Sie können es auch auf einfache Weise tun

def sum(numbers)
  return 0 if numbers.length < 1
  result = 0
  numbers.each { |num| result += num }
  result
end

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X