Есть ли встроенный способ копать хэши и массивы за исключением? - PullRequest
0 голосов
/ 25 января 2019

Представлен Ruby 2.3.0 #dig. Я ищу метод с аналогичной функциональностью, но вместо использования метода #[] для получения значения (за экранами) следует использовать #fetch. В результате возникает исключение, когда ключ / индекс отсутствует.

У меня уже есть решение моей проблемы, использующее простое исправление обезьян.

module DigWithException
  def dig_e(key, *others)
    value = fetch(key)
    return value if others.empty?

    if value.respond_to?(__method__, true)
      value.__send__(__method__, *others)
    else
      raise TypeError, "#{value.class} does not have ##{__method__} method"
    end
  end
end

Array.include(DigWithException)
Hash.include(DigWithException)

Однако кажется, что включение в ядро ​​Ruby или std-lib такой очевидной вещи, что мне было интересно, если я что-то упустил. Это тот случай?

1 Ответ

0 голосов
/ 25 января 2019

Нет такого эквивалента, как вы хотите в stdlib. Большинство людей с такой потребностью просто используют цепной #[] доступ.

Дано:

foo = {bar: {baz: {bang: 1}}}

Подстрочный:

foo[:bar][:baz][:bin]

, что приведет к NoMethodError, если ключ отсутствует (так как # [] возвращает nil для отсутствующего ключа, который вы не можете в дальнейшем расшифровать).

Или, если вы хотите KeyError:

[:bar, :baz, :bin].reduce(foo, :fetch)

#dig - это, прежде всего, уступка тому факту, что мы хотим иногда обходить глубоко вложенный хеш, в котором могут отсутствовать промежуточные ключи, без необходимости проверять каждый доступ на достоверность.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...