J'ai un tableau d'entiers.
Par exemple :
array = [123,321,12389]
Existe-t-il un moyen agréable d'obtenir la somme de ces deux éléments ?
Je sais, que
sum = 0
array.each { |a| sum+=a }
fonctionnerait.
J'ai un tableau d'entiers.
Par exemple :
array = [123,321,12389]
Existe-t-il un moyen agréable d'obtenir la somme de ces deux éléments ?
Je sais, que
sum = 0
array.each { |a| sum+=a }
fonctionnerait.
Comment puis-je utiliser cette méthode pour additionner un attribut d'un objet. Dans mon tableau [product1, product2], je veux additionner product1.price + product2.price. Est-ce possible en utilisant array.inject(:+) ?
Vous pouvez utiliser une astuce similaire avec la méthode map : array.map(&:price).inject(:+)
Essayez ça :
array.inject(0){|sum,x| sum + x }
Voir la documentation sur les Enumérables de Ruby
(remarque : le 0
Le cas de base est nécessaire pour que 0
sera retourné sur un tableau vide au lieu de nil
)
array.inject(:+)
semble causer problème dans Ruby 1.8.6, les exceptions " LocalJumpError : no block given " peuvent apparaître.
array.reduce(0, :+)
Bien que cela soit équivalent à array.inject(0, :+)
le terme réduire le site est en train d'entrer dans un langage plus commun avec l'apparition de Modèles de programmation MapReduce .
injecter , réduire le site , pliage , accumuler y compresser sont tous synonymes d'une classe de fonctions de pliage . Je trouve que la cohérence dans votre base de code est la plus importante, mais comme diverses communautés ont tendance à préférer un mot plutôt qu'un autre, il est néanmoins utile de connaître les alternatives.
Pour souligner le verbiage de map-reduce, voici une version qui est un peu plus indulgente sur ce qui se retrouve dans ce tableau.
array.map(&:to_i).reduce(0, :+)
Quelques lectures supplémentaires pertinentes :
Je suis d'accord, reduce
m'en dit plus sur ce que fait la fonction, mais inject
a l'air beaucoup plus cool.
Le seul commentaire que je ferais est que reduce
y map
car les fonctions d'ordre supérieur sont antérieures à MapReduce. L'inspiration va dans l'autre sens. Et dans le sens de MapReduce, il s'agit d'une opération quelque peu différente d'une simple réduction fonctionnelle, ayant des implications sur la façon dont les différentes machines communiquent.
Les nouvelles versions d'activesupport ne chargent pas toutes les extensions par défaut. Vous voudrez soit exiger seulement le module sum : require 'active_support/core_ext/enumerable.rb'
ou exigent tout le soutien actif : require 'active_support/all'
. Pour en savoir plus, cliquez ici : Docs API
Peu importe que activesupport
est un massif dépendance à glisser dans un projet pour aller de array.inject(:+)
a array.sum
.
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.
40 votes
Veuillez noter que Ruby 2.4+ dispose de
array.sum
1 votes
Ruby 2.6 ne l'a pas. Ruby donne, Ruby reprend, semble-t-il.
2 votes
@Lori hmm ? lien
2 votes
Désolé. À l'époque, j'ai cru par erreur que j'utilisais la version 2.6 en raison d'une erreur de rbenv de ma part.
0 votes
Si vous devez fournir une valeur par défaut pour le moment où l'option
Array
est vide, comme si vous souhaitiez renvoyer unMoney
au lieu d'un objetInteger
vous pouvez faire quelque chose commearray.sum( 0.to_money( "USD" ) )
.