Hash # fetch здесь не имеет значения. Это потому, что fetch
совпадает с Hash # [] , когда, как здесь, fetch
имеет только один аргумент. Итак, давайте сосредоточимся на dig
.
В Ruby v2.3 было введено семейство из трех dig
методов: Hash # dig , Array # dig и OpenStruct # dig . Интересная вещь об этих методах состоит в том, что они вызывают друг друга (но это не объяснено в документах, даже в примерах). В вашей задаче мы можем написать:
response.dig(:results, 0, :value, :destination)
#=> "Rome"
response
- хеш, поэтому Hash#dig
оценивает response[:results]
. Если его значение равно nil
, выражение возвращает nil
. Например,
response.dig(:cat, 0, :value, :destination)
#=> nil
На самом деле response[:results]
- это массив:
arr = response[:results]
#=> [{:type=>"product_group", :value=>{:destination=>"Rome"}},
# {:type=>"product_group", :value=>{:destination=>"Paris"}},
# {:type=>"product_group", :value=>{:destination=>"Madrid"}}]
Hash#dig
поэтому вызывает Array#dig
на arr
, получая хеш
h = arr.dig(0)
#=> {:type=>"product_group", :value=>{:destination=>"Rome"}}
Array#dig
затем вызывает Hash#dig
на h
:
g = h.dig(:value)
#=> {:destination=>"Rome"}
Наконец, g
является хешем, Hash#dig
вызывает Hash#dig
на g
:
g.dig(:destination)
#=> "Rome"