Est-ce que l'injection est la même chose que la réduction en rubis?

114

J'ai vu qu'ils étaient documentés ensemble ici . Sont-ils la même chose? Pourquoi Ruby a-t-il autant d'alias (comme map / collect pour les tableaux)? Merci beaucoup.

Jacky
la source

Réponses:

160

Oui, et il est également appelé folddans de nombreux autres langages de programmation et en mathématiques. Ruby utilise beaucoup d'alias afin d'être intuitif pour les programmeurs d'horizons différents. Si vous souhaitez utiliser #lengthsur un Array, vous pouvez. Si vous voulez l'utiliser #size, c'est bien aussi!

Zach
la source
4
Si vous souhaitez créer vos propres alias, vous pouvez être intéressé par alias_method .
Nick McCurdy
23
#length et #count ne sont pas équivalents en Ruby. #length et #size sont.
Questions Quolonel
9
3.length donne NoMethodError; 3.size renvoie 4. Évidemment, 3 n'est pas un tableau, mais attention à la frappe de canard! (3_000_000_000_000_000.size renvoie 8 et 3_000_000_000_000_000_000_000_000_000_000_000_000_000_000.size renvoie 20; cela semble être la quantité de mémoire qu'il prend.)
ChrisPhoenix
18
hm, je pense que la documentation Ruby actuelle ruby-doc.org/core-2.2.3/Enumerable.html#method-i-reduce pourrait être meilleure si elle dit simplement la même chose que injectpour que les utilisateurs n'aient pas à lire les deux description et essayez de déterminer si elles sont identiques ... cela ne va-t-il pas avec le principe DRY?
nonopolarité
3
@ 太極 者 無極 而 生, bon point, j'étais confus par cela comme vous l'aviez prédit
neontapir
6

Les versions plus récentes de la documentation le Enumerable#reducespécifient explicitement:

Les méthodes injectet reducesont des alias. Il n'y a aucun avantage en termes de performances.

axiac
la source
1
j'aime les séparer en fonction de leur utilisation, évidemment juste pour la sémantique. si c'est un proc ( &:+), réduire, si c'est un bloc, injecter
TheRealMrCrowley