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?

Wie funktioniert dig?

Die Aufrufreihenfolge ist

obj.dig(*identifiers)

Die identifiers definieren einen "Pfad" in die verschachtelten Datenstrukturen

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

In der Standardbibliothek