InhaltsverzeichnisKlicke auf den Link, um zur gewünschten Stelle zu navigieren
Dieser Inhalt wurde automatisch aus dem Ukrainischen übersetzt.
Die Methode map ist eine der am häufigsten verwendeten Methoden in Ruby, die zur Verarbeitung von Sammlungen eingesetzt wird. Sie ermöglicht es, einen Codeblock auf jedes Element der Sammlung anzuwenden und eine neue Sammlung mit den Ergebnissen der Blockausführung zurückzugeben. Tatsächlich ist das alles, was es dazu zu sagen gibt. Aber jede Information wird besser verstanden, wenn sie nicht abstrakt, sondern anhand einfacher und realer Beispiele vermittelt wird. Lassen Sie uns also die Methode map etwas genauer betrachten.
Wie funktioniert map
Die Methode map nimmt einen Block entgegen, der für jedes Element der Sammlung ausgeführt wird. Die Ergebnisse der Blockausführung werden in einem neuen Array gesammelt, das von der Methode map zurückgegeben wird.
Wir führen eine Erhöhung jedes Elements des Arrays um 1 (Inkrement) durch.
numbers = [1, 2, 3, 4, 5]
incremented_numbers = numbers.map { |n| n + 1 }
incremented_numbers
Ergebnis
=> [2, 3, 4, 5, 6]
Vereinfacht gesagt:Wir haben eine Variable numbers, die ein Array von Elementen (eine Sammlung von Elementen) [1, 2, 3, 4, 5] enthält.Dann erstellen wir die Variable incremented_numbers und speichern das Ergebnis der Ausführung der Methode map darin.
Betrachten wir die Konstruktion map:
numbers.map { |n| n + 1 }
# numbers - unsere Variable (Sammlung)
# .map - Aufruf der Methode auf der Variable
# { |n| n + 1 } - Block, der für jedes Element der Sammlung ausgeführt wird
Hier sollten wir den Block selbst betrachten:
{ |n| n + 1 }
- {} - geschweifte Klammern: Dies ist der Blockkörper, in dem sich der Code befindet, der für jedes Element des Arrays ausgeführt wird.
- |n| - Variable: Dies ist der Parameter des Blocks. Jedes Element des Arrays wird nacheinander in diese Variable übergeben.
- n + 1: Dies ist der Ausdruck, der für jedes Element ausgeführt wird. Er addiert 1 zum Wert der Variable n.
Wenn wir numbers.map { |n| n + 1 } ausführen, passiert Folgendes:
Für das erste Element 1:
- n wird 1
- 1 + 1 wird ausgeführt
- Das Ergebnis 2 wird zum neuen Array hinzugefügt
Für das zweite Element 2:
- n wird 2
- 2 + 1 wird ausgeführt
- Das Ergebnis 3 wird zum neuen Array hinzugefügt
Und so weiter für jedes Element des Arrays. Das neue Array speichern wir in der Variable incremented_numbers und schauen uns ihren Inhalt an.
numbers = [1, 2, 3, 4, 5]
incremented_numbers = numbers.map { |n| n + 1 }
incremented_numbers
Ergebnis
=> [2, 3, 4, 5, 6]
Was passiert mit der Variable numbers? Nichts, sie bleibt unverändert.
Ein weiteres Beispiel:
words = ["hello", "world", "ruby"]
new_words = words.map { |word| word.upcase }
new_words
=> ["HELLO", "WORLD", "RUBY"]
words
=> ["hello", "world", "ruby"]
Die Methode upcase modifiziert die Buchstaben (macht sie groß). Daher enthält die Variable new_words die modifizierten Wörter, während words unverändert bleibt.
Übrigens verwenden wir in diesen Beispielen die Blockkonstruktion in geschweiften Klammern. Der Block kann auch über do ... end übergeben werden (in Fällen, in denen der Code zu lang ist und es gut wäre, ihn auf mehrere Zeilen zu verteilen). Das heißt:
numbers.map { |n| n + 1 }
ist dasselbe wie
numbers.map do |n|
n + 1
end
Und ein Beispiel für die Übergabe des Ergebnisses an eine Variable:
incremented_numbers_braces = numbers.map { |n| n + 1 }
incremented_numbers_do_end = numbers.map do |n|
n + 1
end
Noch ein Beispiel, aber wir werden einen Hash modifizieren.
hash = { a: 1, b: 2, c: 3 }
incremented_hash = hash.map { |key, value| [key, value + 1] }
incremented_hash
=> [[:a, 2], [:b, 3], [:c, 4]]
Aber es gibt einen Haken. Die Ausführung von map gibt uns ein Array zurück. Daher müssen wir das Array in einen Hash konvertieren (mithilfe der Methode .to_h).
incremented_hash = incremented_hash.to_h
incremented_hash
=> {:a=>2, :b=>3, :c=>4}
Ich denke, dass in der Konstruktion hash.map { |key, value| [key, value + 1] } recht klar ist, dass wir key und value aus jedem Element des Hashes nehmen und eine solche Konstruktion [key, value + 1] zurückgeben. Das heißt, das Ergebnis der Ausführung von map für ein Element ist die Rückgabe eines Arrays, wobei das erste Element key und das zweite das modifizierte value (value + 1) ist.Das Ergebnis der Ausführung auf der gesamten Sammlung ist:
incremented_hash => [[:a, 2], [:b, 3], [:c, 4]]
Ein Array von Arrays. Die wir dann in einen Hash konvertieren (Aufruf von to_h).
map! - modifiziert das ursprüngliche Array
Das Ausrufezeichen, das der Methode map hinzugefügt wurde, bedeutet, dass die ursprüngliche Sammlung (Variable) modifiziert wird. Diese Art des Methodenaufrufs sollte mit Vorsicht verwendet werden.
numbers = [1, 2, 3, 4, 5]
numbers.map! { |n| n + 1 }
numbers
=> [2, 3, 4, 5, 6]
- map: Erstellt ein neues Array und lässt das ursprüngliche Array unverändert.
- map!: Modifiziert das ursprüngliche Array, indem es seine Elemente vor Ort ändert.
Warum heißt die Methode so (map)?
Der Name map stammt von der mathematischen Operation "Abbildung" (mapping), bei der jedes Element einer Menge in das entsprechende Element einer anderen Menge "abgebildet" wird. In der Programmierung bedeutet dies, eine Funktion oder einen Codeblock auf jedes Element der Sammlung anzuwenden, um eine neue Sammlung mit den Ergebnissen dieser Anwendungen zu erstellen.
Die Methode map in Ruby ist ein leistungsstarkes Werkzeug zur Verarbeitung von Sammlungen, das es ermöglicht, leicht neue Sammlungen zu erstellen, indem jedes Element mithilfe eines angegebenen Blocks transformiert wird. Sie bietet zusätzliche Möglichkeiten (zum Beispiel die Verwendung von Indizes), Alternativen (zum Beispiel each) und sogar Synonyme (collect). Aber das Ziel dieses Beitrags war es, das Prinzip der Funktionsweise der Methode map ohne große Komplikationen zu erklären. Weitere Aspekte werden wir in den nächsten Beiträgen über Ruby behandeln.
Dieser Beitrag hat noch keine Ergänzungen vom Autor.