Spec-Zone.ru › Ruby 3.4

Способы доступа к данным

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

Spec-Zone.ru

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