InhaltsverzeichnisKlicke auf den Link, um zur gewünschten Stelle zu navigieren
Dieser Inhalt wurde automatisch aus dem Ukrainischen übersetzt.
Arrays sind eine der bequemsten Datenstrukturen in Ruby. Sie sind flexibel, dynamisch und verfügen über eine riesige Anzahl eingebauter Methoden, die es ermöglichen, Daten auf die eleganteste Weise zu verarbeiten. Lassen Sie uns die wichtigsten davon anhand von Beispielen betrachten.
each - einfacher Durchlauf von Elementen
Die Methode each iteriert über das Array und führt einen Codeblock für jedes Element aus. Normalerweise wird sie verwendet, wenn etwas mit den Elementen gemacht werden soll, aber kein neues Array erstellt werden muss.
[1, 2, 3, 4, 5].each do |n|
puts "Zahl: #{n}"
end
Ergebnis:
Zahl: 1 Zahl: 2 Zahl: 3 Zahl: 4 Zahl: 5 => [1, 2, 3, 4, 5]
each gibt immer das ursprüngliche Array zurück, nicht das Ergebnis der Blockausführung. Was bedeutet das? Der Block führt puts aus (sehen Sie die gedruckte "Zahl 1" und so weiter). Der Iterator gibt das Array zurück => [1, 2, 3, 4, 5]
Das heißt, wenn der Wert des Iterators einer Variablen zugewiesen wird, erhalten wir das Array.
myvar = [1, 2, 3, 4, 5].each do |n|
puts "Zahl: #{n}"
end
Zahl: 1
Zahl: 2
Zahl: 3
Zahl: 4
Zahl: 5
=> [1, 2, 3, 4, 5]
myvar
=> [1, 2, 3, 4, 5]
map - Transformation von Elementen
Die Methode map (oder collect) erstellt ein neues Array, in dem jedes Element das Ergebnis der Ausführung des Blocks ist.
numbers = [1, 2, 3, 4, 5]
squares = numbers.map { |n| n ** 2 }
p squares # => [1, 4, 9, 16, 25]
Verwenden Sie map, wenn Sie einen neuen Datensatz aus einem vorhandenen Array erhalten möchten.
Was unterscheidet map von collect?
In Ruby ist map einfach der gebräuchlichere Name für Programmierer, die aus anderen Sprachen (JavaScript, Python usw.) kommen. Und collect ist der historische Name, der aus den frühen Versionen von Ruby (unter dem Einfluss von Smalltalk) geblieben ist.
Wenn man sich den Ruby-Code (Enumerable-Modul) ansieht:
alias collect map
Das heißt, es ist ein genaues Synonym, keine Wrapper, kein Delegat - einfach ein anderer Name für dieselbe Methode.
select - Filterung von Elementen
Die Methode select gibt ein Array von Elementen zurück, für die der Block true zurückgibt.
numbers = [1, 2, 3, 4, 5]
even_numbers = numbers.select { |n| n.even? }
p even_numbers # => [2, 4]
Es gibt eine entgegengesetzte Methode - reject, die die Elemente zurückgibt, für die der Block false zurückgibt.
odd_numbers = numbers.reject { |n| n.even? }
p odd_numbers # => [1, 3, 5]
inject / reduce - Akkumulation eines Wertes
inject (Synonym für reduce) ist ein leistungsstarkes Werkzeug zum "Zusammenfassen" eines Arrays in einen Wert. Man kann die Summe berechnen, einen Hash erstellen usw.
numbers = [1, 2, 3, 4, 5]
sum = numbers.inject(0) { |acc, n| acc + n }
p sum # => 15
Es nimmt den Anfangswert (in unserem Fall 0) und gibt ihn zusammen mit jedem Element des Arrays an den Block weiter.
Syntax:
array.inject(initial_value) { |accumulator, element| ... }
- accumulator - die Variable, in der das aktuelle Ergebnis gespeichert wird.
- element - das aktuelle Element des Arrays.
- Der Block gibt ein neues Wert für accumulator zurück.
Ein weiteres Beispiel - Elemente in einen String zusammenführen:
words = ["Ruby", "is", "fun"]
sentence = words.reduce("") { |acc, word| acc + word + " " }
p sentence.strip # => "Ruby is fun"
strip wurde verwendet, um das überflüssige Leerzeichen am Ende zu entfernen.
Der Aufbau eines Hashs würde so aussehen:
letters = %w[a b c]
indexed = letters.inject({}) { |acc, l| acc[l] = l.upcase; acc }
# => {"a"=>"A", "b"=>"B", "c"=>"C"}
Aber hier ist es etwas komplizierter. Die Methode inject (oder reduce) durchläuft die Sammlung und akkumuliert das Ergebnis schrittweise im Akkumulator (acc).
Hier geben wir {} an - also den Anfangswert des Akkumulators - einen leeren Hash.
{ |acc, l| acc[l] = l.upcase; acc }
Das ist der Block, der für jedes Element l im Array aufgerufen wird.
- acc - das aktuelle Akkumulator (anfangs {})
- l - der aktuelle Buchstabe ("a", dann "b", dann "c")
Innerhalb des Blocks:
acc[l] = l.upcase
fügt dem Hash ein Paar hinzu:
- Schlüssel: l (zum Beispiel "a")
- Wert: l.upcase (also "A")
Danach geben wir acc zurück, um es an die nächste Iteration weiterzugeben.
Natürlich kann man das auch auf andere Weise tun, aber hier betrachten wir die Möglichkeiten dieser Methoden.
filter_map - Ruby 2.7+ Magie
Die Methode filter_map kombiniert map und select in einem Durchgang durch das Array. Sie transformiert und filtert gleichzeitig.
numbers = [1, 2, 3, 4, 5, 6]
even_squares = numbers.filter_map { |n| n**2 if n.even? }
p even_squares # => [4, 16, 36]
Das ist bequemer und effizienter als numbers.select { ... }.map { ... }.
Dieser Beitrag hat noch keine Ergänzungen vom Autor.