Comment la somme de tableau de nombres en Ruby?
J'ai un tableau d'entiers.
Par exemple:
array = [123,321,12389]
Est-il un bon moyen pour obtenir la somme d'eux?
Je sais, que
sum = 0
array.each { |a| sum+=a }
serait de travailler.
- Veuillez noter que Ruby 2.4+ a
array.sum
- Ruby 2.6 ne pas l'avoir. Ruby donne, Ruby ôte, il me semble.
- hmm ? lien
- Désolé. À ce moment, j'ai cru, à tort, j'ai été en utilisant 2.6 en raison d'une rbenv erreur de ma part.
Vous devez vous connecter pour publier un commentaire.
Essayez ceci:
Voir Ruby Énumérable de la Documentation
(note: le
0
cas de base est nécessaire afin que les0
sera renvoyé sur un tableau vide au lieu denil
)array.inject(:+)
est plus efficace.array.inject(:+)
semble provoquer des mal en Ruby 1.8.6 Exceptions "LocalJumpError : pas de bloc de donnée" peut-pop-up.array.sum
peut vous donner la somme des valeurs de tableau.reduce
, qui est un alias deinject
(comme dansarray.reduce( :+ )
).inject
plutôt quereduce
.Ou essayez le Ruby 1.9 façon:
Remarque: le
0
cas de base est nécessaire, sinonnil
sera renvoyé sur des tableaux vides:array.map(&:price).inject(0, :+)
est un peu plus sûr. Il permet de s'assurer que si vous avez une liste vide, vous obtenez 0 au lieu de nul.array.inject(0) { |sum, product| sum += product.price }
Alors que l'équivalent de
array.inject(0, :+)
, le terme réduire entre dans une commune de la langue vernaculaire à la montée de Les modèles de programmation MapReduce.injecter, réduire, fois, accumuler, et compresser sont synonymes comme une classe de fonctions de pliage. - Je trouver de la cohérence dans l'ensemble de votre base de code plus important, mais depuis que les différentes communautés ont tendance à préférer un mot par un autre, il est néanmoins utile de connaître les alternatives.
À souligner la carte-réduire le verbiage, voici une version un peu plus indulgent sur ce qui se retrouve dans ce tableau.
Certains pertinentes supplémentaires de lecture:
reduce
me dit plus de quoi la fonction, maisinject
ne sembler beaucoup plus fraîches.reduce
etmap
que les fonctions d'ordre supérieur sont antérieurs à MapReduce. L'inspiration s'exécute dans l'autre sens. Et dans le MapReduce sens, c'est un peu différent qu'un simple fonctionnel réduire ayant des implications pour la façon dont les différentes machines à communiquer.Sinon (juste pour la comparaison), si vous avez des Rails installés (en fait juste ActiveSupport):
require 'active_support/core_ext/enumerable.rb'
, ou exigent que tous les actifs de support:require 'active_support/all'
. Plus à ce sujet ici: API Docsactivesupport
est un massif de la dépendance à glisser dans un projet pour aller dearray.inject(:+)
àarray.sum
.require 'active_support/core_ext/enumerable'
sans.rb
suffixe, puisque c'est ajouté automatiquement.Pour Ruby >=2.4.0 vous pouvez utiliser
sum
de Enumerables.Il est dangereux de mokeypatch classes de base. Si vous aimez le danger, et en utilisant une ancienne version de Ruby, vous pouvez ajouter
#sum
à laArray
classe:Array#sum
; à savoir, qu'ils prennent un argument facultatif et un bloc optionnel. La définition deArray#sum
comme vous l'avez entraînerait une exception soulevée, oùsum
est apparu dans le code avec un argument ou un bloc.Nouvelle pour Ruby 2.4.0
Vous pouvez utiliser la bien nommée méthode
Enumerable#sum
. Il a beaucoup d'avantages par rapport àinject(:+)
mais il y a quelques remarques importantes à lire à la fin aussi.Exemples
Plages
Tableaux
Remarque importante
Cette méthode n'est pas équivalent à
#inject(:+)
. Par exempleAussi,
Voir cette réponse pour plus d'informations sur pourquoi
sum
est comme ça.Juste pour le plaisir de la diversité, vous pouvez également le faire si votre tableau n'est pas un tableau de nombres, mais plutôt un tableau d'objets qui ont des propriétés qui sont des nombres (par exemple, quantité):
array.map(&:amount).inject(0, :+)
. Voir les autres réponses.map
puisinject
vous oblige à parcourir le tableau à deux reprises: une fois pour créer un nouveau tableau, l'autre à la somme des membres. Cette méthode est un peu plus verbeux, mais aussi plus efficace.Ruby 2.4+ /Rails -
array.sum
c'est à dire[1, 2, 3].sum # => 6
Ruby pré 2.4 -
array.inject(:+)
ouarray.reduce(:+)
*Remarque: Le
#sum
méthode est une nouvelle addition à 2,4 pourenumerable
donc, vous allez maintenant être en mesure d'utiliserarray.sum
dans le plus pur ruby, et pas seulement des Rails.ruby 1.8.7 est la suivante:
Vous pouvez simplement utiliser:
inject(:+)
mais ce n'est pasinject :+
?Ruby 2.4.0 est sorti, et il a une Énumérable#somme méthode. Ainsi, vous pouvez faire
Exemples de la documentation:
C'est Assez
[1,2,3].inject('+')
Permet également
[1,2].sum{|x| x * 2 } == 6
:pour tableau à néant les valeurs que nous pouvons faire compact et puis injecter la somme
ex-
Fonctionne pour Plages trop...
par conséquent,
Si vous vous sentez golfy, vous pouvez le faire
Cela va créer une chaîne "123+321+12389" et puis utiliser la fonction eval pour faire la somme. C'est seulement pour le golf but, vous ne devriez pas l'utiliser dans un code approprié.
Méthode 1:
Méthode 2:
Méthode 3:
Méthode 4:
Lorsque le Tableau contient un néant et le vide des valeurs par défaut si vous utilisez toutes les fonctions ci-dessus réduire, somme, injecter tout ce qui va par le biais de la
Vous pouvez surmonter cela,
Méthode 6:
eval
Évalue le Rubis expression(s) dans la chaîne.
Ou vous pouvez essayer cette méthode:
C'est le chemin le plus court. L'essayer.
array.inject :+
*Cela a bien fonctionné pour moi comme un nouveau développeur. Vous pouvez régler votre gamme de nombre en modifiant les valeurs dans les []
3 façons de faire la somme de la matrice de
1)
array.inject(0){|sum,x| sum + x }
2)
array.inject('+')
3)
array.join('+')
Vous pouvez aussi le faire de manière simple
Vous pouvez utiliser .carte et .somme comme:
array.sum