modul Enumerable

Was gibt es hier

Das Modul Enumerable stellt Methoden bereit, die für eine Sammlungs-Klasse nützlich sind für

Methoden zum Abfragen

Diese Methoden geben Informationen über die Enumerable zurück, die sich von den Elementen selbst unterscheiden

Methoden zum Abrufen

Diese Methoden geben Einträge aus der Enumerable zurück, ohne sie zu verändern

Führende, nachfolgende oder alle Elemente:

Elemente mit minimalem und maximalem Wert:

Gruppen, Slices und Partitionen:

Methoden zur Suche und Filterung

Diese Methoden geben Elemente zurück, die eine bestimmte Bedingung erfüllen

Methoden zur Sortierung

Diese Methoden geben Elemente in sortierter Reihenfolge zurück

Methoden zur Iteration

Andere Methoden

Verwendung

Um das Modul Enumerable in einer Sammlungs-Klasse zu verwenden

Beispiel

class Foo
  include Enumerable
  def each
    yield 1
    yield 1, 2
    yield
  end
end
Foo.new.each_entry{ |element| p element }

Ausgabe

1
[1, 2]
nil

Enumerable in Ruby-Klassen

Diese Ruby Core-Klassen enthalten (oder erweitern) Enumerable

Diese Ruby Standardbibliothek-Klassen enthalten Enumerable

Praktisch alle Methoden in Enumerable rufen die Methode each in der inkludierenden Klasse auf

Über die Beispiele

Die Beispielcode-Schnipsel für die Enumerable-Methoden

Erweiterte Methoden

Eine Enumerable-Klasse kann erweiterte Methoden definieren. Dieser Abschnitt beschreibt das Standardverhalten von Erweiterungsmethoden zu Referenzzwecken.

size

Enumerator hat eine size-Methode. Sie verwendet das der Methode Enumerator.new übergebene Funktionsargument size.

e = Enumerator.new(-> { 3 }) {|y| p y; y.yield :a; y.yield :b; y.yield :c; :z }
p e.size #=> 3
p e.next #=> :a
p e.next #=> :b
p e.next #=> :c
begin
  e.next
rescue StopIteration
  p $!.result #=> :z
end

Das Ergebnis der size-Funktion sollte die Anzahl der Iterationen darstellen (d. h. wie oft Enumerator::Yielder#yield aufgerufen wird). Im obigen Beispiel ruft der Block yield dreimal auf, und die size-Funktion, +-> { 3 }+, gibt entsprechend 3 zurück. Das Ergebnis der size-Funktion kann eine Ganzzahl, Float::INFINITY oder nil sein. Eine Ganzzahl bedeutet die genaue Anzahl der yield-Aufrufe, wie oben gezeigt. Float::INFINITY zeigt eine unendliche Anzahl von yield-Aufrufen an. nil bedeutet, dass die Anzahl der yield-Aufrufe schwierig oder unmöglich zu bestimmen ist.

Viele Iterationsmethoden geben ein Enumerator-Objekt mit einer entsprechenden size-Funktion zurück, wenn kein Block gegeben ist.

Beispiele

["a", "b", "c"].each.size #=> 3
{a: "x", b: "y", c: "z"}.each.size #=> 3
(0..20).to_a.permutation.size #=> 51090942171709440000
loop.size #=> Float::INFINITY
(1..100).drop_while.size #=> nil  # size depends on the block's behavior
STDIN.each.size #=> nil # cannot be computed without consuming input
File.open("/etc/resolv.conf").each.size #=> nil # cannot be computed without reading the file

Das Verhalten von size für Range-basierte Enumeratoren hängt vom Anfangselement ab

Beispiele

(10..42).each.size #=> 33
(10..42.9).each.size #=> 33 (the #end element may be a non-integer numeric)
(10..).each.size #=> Float::INFINITY
("a".."z").each.size #=> nil
("a"..).each.size #=> nil
(1.0..9.0).each.size # raises TypeError (Float does not have #succ)
(..10).each.size # raises TypeError (beginless range has nil as its #begin)

Das Modul Enumerable selbst definiert keine size-Methode. Eine Klasse, die Enumerable enthält, kann ihre eigene size-Methode definieren. Es wird empfohlen, dass eine solche size-Methode mit Enumerator#size konsistent ist.

Array und Hash implementieren size und geben Werte zurück, die mit Enumerator#size konsistent sind. IO und Dir definieren keine size, was ebenfalls konsistent ist, da die size-Funktion des entsprechenden Enumerators nil zurückgibt.

Es ist jedoch nicht zwingend erforderlich, dass die size-Methode einer Klasse mit Enumerator#size übereinstimmt. Beispielsweise gibt File#size die Anzahl der Bytes in der Datei zurück, nicht die Anzahl der Zeilen.