Array#each führt den angegebenen Block für jedes Element des Arrays aus und gibt dann das Array selbst zurück.
Array#map führt auch den angegebenen Block für jedes Element des Arrays aus, gibt jedoch ein neues Array zurück, dessen Werte die Rückgabewerte jeder Iteration des Blocks sind.
Beispiel: Angenommen, Sie haben ein Array wie folgt definiert:
Beachten Sie, dass der Rückgabewert einfach dasselbe Array ist. Der Code im eachBlock wird ausgeführt, die berechneten Werte werden jedoch nicht zurückgegeben. und da der Code keine Nebenwirkungen hat, führt dieses Beispiel keine nützliche Arbeit aus.
Im Gegensatz dazu gibt der Aufruf der Array- mapMethode ein neues Array zurück, dessen Elemente die Rückgabewerte jeder Ausführungsrunde des mapBlocks sind:
Perfekte Antwort zu verstehen. Nur ein .. Haftungsausschluss: Wenn Sie den Rückgabewert der Kartenfunktion überbeanspruchen, können Sie möglicherweise viel Speicher verschwenden.
Imran Ahmad
33
Die Nebenwirkungen sind die gleichen, was Ihr Reverse Engineering verwirrt.
Ja, beide iterieren über das Array (tatsächlich über alles, was sich in Enumerable mischt ), aber map gibt ein Array zurück, das aus den Blockergebnissen besteht, während jedes nur das ursprüngliche Array zurückgibt .
In diesem Fall habe ich keinen Block übergeben, sondern nur einen Symbol. class SymbolObjekte haben jedoch eine to_procMethode, die Folgendes ergibt:
[:how.to_s,:now.to_s,...]
Übrigens fällt es Ihnen möglicherweise schwer, die Dokumentation zu finden, da map eine Methode in Enumerable ist, während jede (die eine vom Enumerable- Modul erforderliche Methode ) eine Methode in Array ist .
Als Trivia-Hinweis: Die Kartenimplementierung basiert auf jedem .
Wenn Sie die Zuordnung zu einem Hash verwenden, wird der Hash implizit in ein Array umgewandelt
[["d",[11,22]],["f",[33,44,55]]]
vs.each {...} gibt Ihnen nur die letzte Bewertung zurück, nämlich [11, 22] für ["d", [11, 22]] und [33, 44, 55] für ["f", [ 33, 44, 55]]. Also vor dem letzten Join haben Sie
Dies ist keine Antwort auf die Frage. Die Frage betrifft den Unterschied zwischen each, der den angegebenen Block ausführt und das ursprüngliche Array zurückgibt. und map, das ein Array mit dem Ergebnis der Ausführung des Blocks als Werte zurückgibt
Die Nebenwirkungen sind die gleichen, was Ihr Reverse Engineering verwirrt.
Ja, beide iterieren über das Array (tatsächlich über alles, was sich in Enumerable mischt ), aber map gibt ein Array zurück, das aus den Blockergebnissen besteht, während jedes nur das ursprüngliche Array zurückgibt .
Der Rückgabewert jedes Arrays ist nur das ursprüngliche Array und wird im Ruby-Code selten verwendet, aber Map ist eines der wichtigsten funktionalen Werkzeuge .
Sie
map
geben ein Array zurück, das die Ergebnisse des übergebenen Blocks oder der benannten Methode enthält. Beispielsweise:In diesem Fall habe ich keinen Block übergeben, sondern nur einen
Symbol
.class Symbol
Objekte haben jedoch eineto_proc
Methode, die Folgendes ergibt:Übrigens fällt es Ihnen möglicherweise schwer, die Dokumentation zu finden, da map eine Methode in Enumerable ist, während jede (die eine vom Enumerable- Modul erforderliche Methode ) eine Methode in Array ist .
Als Trivia-Hinweis: Die Kartenimplementierung basiert auf jedem .
quelle
Hier ist eine kurze Demo, wie sich die Karten von den einzelnen unterscheiden
Sie sehen, dass die Map zurückkehrt,
["map_a", "map_b", "map_c"]
während jede nur iteriert, aber das ursprüngliche Array zurückgibt :["a", "b", "c"]
.Jedes wird also zur Verarbeitung eines Arrays verwendet, und die Karte wird verwendet, um etwas mit einem verarbeiteten Array zu tun.
quelle
.each
Gibt dasselbe Array zurück, das Sie ursprünglich bereitgestellt haben:.map
Gibt aus den Ergebnissen jedes Blockaufrufs ein neues Array zurück:quelle
Array # Jede Methode gibt dasselbe Array zurück
Die Array # Map-Methode gibt ein neues Array zurück
quelle
Wenn Sie die Zuordnung zu einem Hash verwenden, wird der Hash implizit in ein Array umgewandelt
vs.each {...} gibt Ihnen nur die letzte Bewertung zurück, nämlich [11, 22] für ["d", [11, 22]] und [33, 44, 55] für ["f", [ 33, 44, 55]]. Also vor dem letzten Join haben Sie
quelle
Sie können auch
map
mit Bang verwendenmap!
, um das Quell-Array zu ändernquelle
each
, der den angegebenen Block ausführt und das ursprüngliche Array zurückgibt. undmap
, das ein Array mit dem Ergebnis der Ausführung des Blocks als Werte zurückgibt