Es gibt keinen Unterschied, tatsächlich mapist es in C als rb_ary_collectund implementiert enum_collect(z. B. gibt es einen Unterschied zwischen mapeinem Array und einer anderen Aufzählung, aber keinen Unterschied zwischen mapund collect).
Warum beides mapund collectin Ruby existieren? Die mapFunktion hat viele Namenskonventionen in verschiedenen Sprachen. Wikipedia bietet einen Überblick :
Die Kartenfunktion stammt ursprünglich aus funktionalen Programmiersprachen, wird heute jedoch auch in vielen prozeduralen, objektorientierten und multiparadigmatischen Sprachen unterstützt (oder kann definiert werden): In der Standardvorlagenbibliothek von C ++ wird sie transformin C # (3.0) genannt LINQ-Bibliothek wird als Erweiterungsmethode bereitgestellt Select. Map ist auch eine häufig verwendete Operation in Hochsprachen wie Perl, Python und Ruby. Die Operation wird mapin allen drei Sprachen aufgerufen . Ein collectAlias für die Karte ist auch in Ruby (von Smalltalk) [Hervorhebung von mir] enthalten. Common Lisp bietet eine Familie von kartenähnlichen Funktionen. mapcarDasjenige, das dem hier beschriebenen Verhalten entspricht, heißt (-car, das den Zugriff mit der CAR-Operation anzeigt).
Ruby bietet Programmierern aus der Smalltalk-Welt einen Alias, um sich besser zu Hause zu fühlen.
Warum gibt es eine andere Implementierung für Arrays und Enums? Eine Aufzählung ist eine verallgemeinerte Iterationsstruktur, was bedeutet, dass Ruby auf keinen Fall vorhersagen kann, was das nächste Element sein kann (Sie können unendliche Aufzählungen definieren, siehe Prime für ein Beispiel). Daher muss eine Funktion aufgerufen werden, um jedes aufeinanderfolgende Element abzurufen (normalerweise ist dies die eachMethode).
Arrays sind die am häufigsten verwendete Sammlung, daher ist es sinnvoll, ihre Leistung zu optimieren. Da Ruby viel über die Funktionsweise von Arrays weiß, muss es nicht aufrufen, eachsondern kann nur eine einfache Zeigermanipulation verwenden, die erheblich schneller ist.
Ähnliche Optimierungen gibt es für eine Reihe von Array-Methoden wie zipoder count.
mapwird bei Code Golf bevorzugt .