Fallback-значение для хеша в Ruby

При разработке приложений на языке Ruby каждый разработчик почти всегда работает с хешами. Особенно часто приходится сталкиваться с вложенными хешами, например: ``` u = { 'user' => { 'id' => 1, 'lang' => { 'id' => 1, 'name' => 'Ruby' } } } u['user']['lang']['name'] # => "Ruby" ``` Цепочка ключей выглядит круто, но она работает только до тех пор, пока у вас есть значения для этих ключей: ``` u = { 'user' => { 'id' => 2, 'lang' => nil } } u['user']['lang']['name'] # undefined method '[]' for nil (NoMethodError) ``` Для исправления этой ошибки вы можете использовать метод send (правда, выглядит это довольно жутко): ``` u.send(:[], 'user')&.send(:[], 'lang')&.send(:[], 'name') || 'No name' ``` Или гораздо более элегантное решение с помощью dig: ``` u.dig('user', 'lang', 'name') || 'No name' ``` Кстати, если вы не знали, метод dig можно комбинировать и с массивами: ``` u = { 'user' => { 'id' => 2, 'roles' => [{ 'id' => 1, 'name' => 'admin' }] } } u.dig('user', 'roles', 0, 'name') # => "admin" ``` Но что делать, если вам нужно получить fallback-значение для ключа, которого нет в хеше, да и самого хеша может не быть? За годы своей работы я пришел к такому варианту: ``` h = [ { 'key' => 'value' }, {}, nil ].sample h&.fetch('otherkey', nil) || 'None' ``` Другие варианты показаны на скриншоте. Сталкивались ли вы с таким в своей работе? Может, есть более элегантное решение, о котором я не знаю?

#Ruby #Hash #Fallback #Default #Fetch #Dig

Fallback-значение для хеша в Ruby | Сетка — социальная сеть от hh.ru