Alle Originalinhalte werden auf Ukrainisch erstellt. Noch nicht alle Inhalte wurden übersetzt. Einige Beiträge sind möglicherweise nur auf Ukrainisch verfügbar.Mehr erfahren

Wie Arrays in Ruby funktionieren: praktische Beispiele für each, map, select, inject, reduce, filter_map

Beitrags-Cover: Wie Arrays in Ruby funktionieren: praktische Beispiele für each, map, select, inject, reduce, filter_map
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.

Wie self, protected und private funktioniert (Ruby)
28. Okt, 13:52 Uhr

Wie self, protected und private funktioniert (Ruby)

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska
Ganzzahlige Division in Ruby: Warum 6 / 4 gleich 1 ist
28. Okt, 14:10 Uhr

Ganzzahlige Division in Ruby: Warum 6 / 4 gleich 1 ist

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska
28. Okt, 14:42 Uhr

Wie funktioniert &:to_s in Ruby und was ist Symbol#to_proc

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska
Was sind Proc und Lambda in Ruby?
28. Okt, 15:57 Uhr

Was sind Proc und Lambda in Ruby?

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska
Was passiert, wenn man [1, 2, 3].map(&Person) aufruft?
29. Okt, 17:54 Uhr

Was passiert, wenn man [1, 2, 3].map(&Person) aufruft?

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska
Singleton-Klasse (Eigenklasse) in Ruby: was ist das und wozu wird sie benötigt
29. Okt, 18:29 Uhr

Singleton-Klasse (Eigenklasse) in Ruby: was ist das und wozu wird sie benötigt

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska