Методы Dig
Методы dig Руби полезны для доступа к вложенным структурам данных.
Рассмотрим эти данные:
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"}
]
}
Без метода dig, можно написать:
item[:batters][:batter][1][:type] # => "Chocolate"
С методом dig, можно написать:
item.dig(:batters, :batter, 1, :type) # => "Chocolate"
Без метода dig, можно написать (ошибочно, вызывается NoMethodError (undefined method `[]' for nil:NilClass)):
item[:batters][:BATTER][1][:type]
С методом dig, можно написать (по-прежнему ошибочно, но без исключения):
item.dig(:batters, :BATTER, 1, :type) # => nil
Почему dig лучше?
-
Он имеет меньше синтаксических элементов (чтобы не ошибиться).
-
Он лучше читается.
-
Он не вызывает исключение, если элемент не найден.
Как работает dig?
Последовательность вызовов:
obj.dig(*identifiers)
Методы identifiers определяют «путь» в вложенные структуры данных:
-
Для каждого идентификатора в
identifiers, вызывается метод #dig на приемнике с этим идентификатором. -
Первый приемник — это
self. -
Каждый последующий приемник — это значение, возвращённое предыдущим вызовом
dig. -
Возвращаемое значение — это значение, возвращённое последним вызовом
dig.
Метод dig вызывает исключение, если какой-либо приемник не отвечает на #dig:
h = { foo: 1 }
# Raises TypeError (Integer does not have #dig method):
h.dig(:foo, :bar)
Что ещё?
Вышеприведённая структура содержит объекты Hash и Array, оба из которых имеют метод dig.
Всего существует шесть встроенных классов Ruby, которые имеют метод dig, три в базовых классах и три в стандартной библиотеке.
В базовых классах:
-
Array#dig: первый аргумент — целочисленный индекс. -
Hash#dig: первый аргумент — ключ. -
Struct#dig: первый аргумент — ключ.
В стандартной библиотеке:
-
OpenStruct#dig: первый аргумент — имя типа String. -
CSV::Table#dig: первый аргумент — целочисленный индекс или заголовок типа String. -
CSV::Row#dig: первый аргумент — целочисленный индекс или заголовок типа String.
Ruby Core © 1993–2022 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.