2010-03-30 5 views
3

Je me familiarise avec Ruby et c'est la première fois que je vois des synonymes pour les méthodes de la bibliothèque standard. Pour l'instant j'ai trouvé ceux dans le module Enumerable:Méthode synonymes dans Ruby

collect <-> map 
detect <-> find 
include <-> member 
etc. 

Probablement d'autres modules contient des méthodes synonymiques aussi. Pourquoi sont-ils là? Est-ce une sorte de compatibilité ascendante? Ou est-ce une caractéristique de la langue, de sorte que le programmeur peut choisir entre différentes options selon le contexte pour faire ressembler le programme à un anglais simple?

+0

+1. Ruby utilise des synonymes à plusieurs reprises, (je pense) non seulement pour la rétrocompatibilité, mais aussi pour la lisibilité. Par exemple, le nombre d'éléments dans un tableau peut être récupéré avec 'count',' length' ou 'size'. Des mots différents pour le même attribut d'un tableau, mais par là, Ruby vous permet de choisir le mot le plus approprié dans votre code: voulez-vous le _number_ des éléments que vous collectez, le _length_ d'un tableau, ou le _size_ actuel de la structure? De toute évidence, ils sont tous les mêmes, mais choisir le bon mot rend votre code plus facile à lire dans votre contexte; une belle propriété de la langue. –

Répondre

3

Je pense qu'il est fait pour être compatible avec l'utilisation des mots d'autres langages de programmation. Ruby est basé sur Smalltalk. Dans Smalltalk, collect signifie carte. Cependant, la plupart des langages de programmation dans le monde utilisent map, Ruby a donc ajouté map pour que les autres utilisateurs se sentent familiers.

Voir http://en.wikipedia.org/wiki/Map_function pour plus de détails.

3

Les synonymes construire sur la familiarité des utilisateurs venant d'horizons différents de script ou de programmation avec la nomenclature existante (par exemple map, grep etc. sont très familières aux gens qui viennent d'un milieu Perl.)

Il vient aussi parfois utile, indirectement, d'avoir ces synonymes, par exemple dans Rails associations, qui est également destiné à se comporter comme un énumérable, find est surchargé pour effectuer une requête SQL réelle alors que le synonyme detect reste disponible pour faire le nombre réel find/detect.

+0

Je n'ai pas obtenu la partie de recherche/détection. Voulez-vous dire qu'il y a une différence entre eux dans certains scenarious? – Max

+1

@Max: Oui, il y aura une différence dans les scénarios où l'une des méthodes a été remplacée et l'autre non. Par exemple, si je fais 'def find (* x) nil end', alors' find' échouera toujours mais 'detect' fonctionnera toujours. – Chuck