Ich habe dies gegoogelt und uneinheitliche / widersprüchliche Meinungen erhalten - gibt es tatsächlich einen Unterschied zwischen einem map
und collect
einem Array in Ruby / Rails?
Die Dokumente scheinen keine zu suggerieren, aber gibt es vielleicht Unterschiede in der Methode oder Leistung?
map
wird bei Code Golf bevorzugt .map
bei CodeGolf bevorzugt wird, was möglicherweise nicht für alle offensichtlich ist: Nur weilcollect
vier Zeichen länger sind alsmap
, aber in der Funktionalität gleich.collect
lesbarer und natürlicher - die Idee, Datensätze zu sammeln und ihnen X zuzuweisen, ist für mich natürlicher, als Datensätze zuzuordnen und ihnen X zuzuweisen.Antworten:
Es gibt keinen Unterschied, tatsächlich
map
ist es in C alsrb_ary_collect
und implementiertenum_collect
(z. B. gibt es einen Unterschied zwischenmap
einem Array und einer anderen Aufzählung, aber keinen Unterschied zwischenmap
undcollect
).Warum beides
map
undcollect
in Ruby existieren? Diemap
Funktion hat viele Namenskonventionen in verschiedenen Sprachen. Wikipedia bietet einen Überblick :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
each
Methode).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,
each
sondern kann nur eine einfache Zeigermanipulation verwenden, die erheblich schneller ist.Ähnliche Optimierungen gibt es für eine Reihe von Array-Methoden wie
zip
odercount
.quelle
count
,length
odersize
. Verschiedene Wörter für dasselbe Attribut eines Arrays. Auf diese Weise können Sie mit Ruby das am besten geeignete Wort für Ihren Code auswählen: Möchten Sie die Anzahl der Elemente, die Sie sammeln, die Länge eines Arrays oder die aktuelle Größe von die Struktur. Im Wesentlichen sind sie alle gleich, aber wenn Sie das richtige Wort auswählen, ist Ihr Code möglicherweise leichter zu lesen, was eine nette Eigenschaft der Sprache ist.Mir wurde gesagt, dasssie gleich sind.Tatsächlich sind sie an derselben Stelle unter ruby-doc.org dokumentiert:
http://www.ruby-doc.org/core/classes/Array.html#M000249
quelle
Ich habe einen Benchmark-Test durchgeführt, um diese Frage zu beantworten, und dann diesen Beitrag gefunden. Hier sind meine Ergebnisse (die sich geringfügig von den anderen Antworten unterscheiden).
Hier ist der Benchmark-Code:
Und die Ergebnisse, die ich bekam, waren:
Vielleicht ist ein Alias nicht frei?
quelle
Die Methoden
collect
undcollect!
sind Aliase fürmap
undmap!
, sodass sie austauschbar verwendet werden können. Hier ist eine einfache Möglichkeit, dies zu bestätigen:quelle
Ruby aliasisiert die Methode Array # map to Array # collect. Sie können austauschbar verwendet werden. (Rubinmönch)
Mit anderen Worten, der gleiche Quellcode:
http://ruby-doc.org/core-2.2.0/Array.html#method-i-map
quelle