Dig-Methoden
Rubys dig-Methoden sind nützlich für den Zugriff auf verschachtelte Datenstrukturen.
Betrachten Sie diese Daten
item = { id: "0001", type: "donut", name: "Cake", ppu: 0.55, batters: { batter: [ {id: "1001", type: "Regular"}, {id: "1002", type: "Chocolate"}, {id: "1003", type: "Blueberry"}, {id: "1004", type: "Devil's Food"} ] }, topping: [ {id: "5001", type: "None"}, {id: "5002", type: "Glazed"}, {id: "5005", type: "Sugar"}, {id: "5007", type: "Powdered Sugar"}, {id: "5006", type: "Chocolate with Sprinkles"}, {id: "5003", type: "Chocolate"}, {id: "5004", type: "Maple"} ] }
Ohne eine dig-Methode können Sie schreiben
item[:batters][:batter][1][:type] # => "Chocolate"
Mit einer dig-Methode können Sie schreiben
item.dig(:batters, :batter, 1, :type) # => "Chocolate"
Ohne eine dig-Methode können Sie fehlerhaft schreiben (löst NoMethodError (undefined method `[]' for nil:NilClass) aus)
item[:batters][:BATTER][1][:type]
Mit einer dig-Methode können Sie schreiben (immer noch fehlerhaft, aber vermeidet die Ausnahme)
item.dig(:batters, :BATTER, 1, :type) # => nil
Warum ist dig besser?
-
Sie hat weniger syntaktische Elemente (die man falsch machen kann).
-
Sie liest sich besser.
-
Sie löst keine Ausnahme aus, wenn ein Element nicht gefunden wird.
Wie funktioniert dig?
Die Aufrufreihenfolge ist
obj.dig(*identifiers)
Die identifiers definieren einen "Pfad" in die verschachtelten Datenstrukturen
-
Für jeden Bezeichner in
identifiersruft sie die Methode #dig auf einem Empfänger mit diesem Bezeichner auf. -
Der erste Empfänger ist
self. -
Jeder nachfolgende Empfänger ist der Wert, der vom vorherigen Aufruf von
digzurückgegeben wurde. -
Der endgültig zurückgegebene Wert ist der Wert, der vom letzten Aufruf von
digzurückgegeben wurde.
Eine dig-Methode löst eine Ausnahme aus, wenn ein Empfänger nicht auf #dig reagiert
h = { foo: 1 } # Raises TypeError (Integer does not have #dig method): h.dig(:foo, :bar)
Was noch?
Die obige Struktur hat Hash-Objekte und Array-Objekte, die beide die Instanzmethode dig haben.
Insgesamt gibt es sechs eingebaute Ruby-Klassen, die die Methode dig haben, drei in den Kernklassen und drei in der Standardbibliothek.
Im Kern
-
Array#dig: das erste Argument ist ein Integer-Index. -
Hash#dig: das erste Argument ist ein Schlüssel. -
Struct#dig: das erste Argument ist ein Schlüssel.
In der Standardbibliothek
-
OpenStruct#dig: das erste Argument ist ein String-Name.
-
CSV::Table#dig: das erste Argument ist ein Integer-Index oder ein String-Header.
-
CSV::Row#dig: das erste Argument ist ein Integer-Index oder ein String-Header.