Ruby dig set - присваивает значения, используя Hash # dig - PullRequest
4 голосов
/ 17 июня 2019

В основном я хочу назначить массив, используя #dig.

Мой должен быть таким:

hash = {
   :first => {
      :second => [1,2,3,4]
  }
}

и я бы использовал Hash#dig

hash.dig(:first, :second) = [1,2,3,4]

Как я могу присвоить это значение?

Ответы [ 3 ]

3 голосов
/ 17 июня 2019

Вы можете создать хеш, который ведет себя так, как вы хотите. Hash.new принимает блок, который вызывается при сбое поиска ключа. Когда это произойдет, мы можем создать пустой хеш:

hash = Hash.new { |hash, key| hash[key] = Hash.new(&hash.default_proc) }

hash[:first][:second] = [1, 2, 3, 4]

hash # => {:first=>{:second=>[1, 2, 3, 4]}}

Обратите внимание, что простой доступ к несуществующему ключу приведет к созданию нового хэша:

hash.dig(:a, :b, :c) # => {}

hash # => {:first=>{:second=>[1, 2, 3, 4]}, :a=>{:b=>{:c=>{}}}}

hash[:foo].nil? # => false
3 голосов
/ 17 июня 2019

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

Для вашего случая вы можете сделать одно из двух:

hash = { first: { second: [1, 2, 3, 4] } }

Или:

hash[:first] = { second: [1, 2, 3, 4] }

Вы также можете использовать подход в этом посте: Как динамически установить значение вложенного ключа в хэше Ruby

Они создаютновый метод хеширования для динамического присвоения вложенных значений хешу.

2 голосов
/ 17 июня 2019

Я предположил, что ответ на вопрос, который я поднял в комментарии к этому вопросу, "да".

Можно использовать Enumerable # уменьшать (a.k.a. inject):

def undig(*keys, value)
  keys[0..-2].reverse_each.reduce (keys.last=>value) { |h,key| { key=>h } }   
end

undig(:first, :second, [1,2,3,4])
  #=> {:first=>{:second=>[1, 2, 3, 4]}} 

или рекурсия:

def undig(*keys, value)
  keys.empty? ? value : { keys.first=>undig(*keys.drop(1), value) }
end

undig(:first, :second, [1,2,3,4])
  #=> {:first=>{:second=>[1, 2, 3, 4]}} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...