Spec-Zone.ru › Ruby 3.1

Методы 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.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API