¿Cuál es la forma más rubí-ish de acceder a valores hash anidados a profundidades arbitrarias? [duplicar

Esta pregunta ya tiene una respuesta aquí:

¿Cómo evitar NoMethodError para elementos faltantes en hashes anidados, sin comprobaciones nulas repetidas? 17 respuestas

Dado un hash como:

AppConfig = {
  'service' => {
    'key' => 'abcdefg',
    'secret' => 'secret_abcdefg'
  },
  'other' => {
    'service' => {
      'key' => 'cred_abcdefg',
      'secret' => 'cred_secret_abcdefg'
    }
  }
}

Necesito una función para devolver el servicio / clave en algunos casos y otro / servicio / clave en otros casos. Una forma sencilla es pasar el hash y una serie de claves, de esta manera:

def val_for(hash, array_of_key_names)
  h = hash
  array_of_key_names.each { |k| h = h[k] }
  h
end

Para que esta llamada resulte en 'cred_secret_abcdefg':

val_for(AppConfig, %w[other service secret])

arece que debería haber una mejor manera de lo que he escrito en val_for ().

Respuestas a la pregunta(4)

Su respuesta a la pregunta