Способы доступа к данным
Методы dig Ruby полезны для доступа к вложенным структурам данных.
Рассмотрим эти данные:
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: первый аргумент — строка имени. -
CSV::Table#dig: первый аргумент — целочисленный индекс или строка заголовка.
-
CSV::Row#dig: первый аргумент — целочисленный индекс или строка заголовка.
Ruby Core © 1993–2024 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.