Anteriormente apresentamos o método dig para lidar com hashes e arrays em Ruby. Neste artigo, vamos falar de outro método interessante: o fetch. Considere o código a seguir:
dictionary = { 'bread' => 'pão',
'butter' => 'manteiga',
'egg' => 'ovo',
'milk' => 'leite'
}
dictionary['egg']
#=> "ovo"
dictionary['knife']
#=> nil
dictionary.fetch('egg')
#=> "ovo"
dictionary.fetch('knife')
#=> KeyError (key not found: "knife")
Primeiramente, notamos que o método fetch funciona exatamente para obter o valor associado a uma chave numa hash em Ruby. No entanto, quando a chave procurada não existe na hash, o comportamento é diferente. Note como, usando o fetch, conseguimos um erro do tipo KeyError, que apresenta o dado responsável pelo problema, no lugar de retornar apenas nil.
Vimos que quando o fetch recebe apenas um argumento, ele sobe o erro KeyError caso a chave não seja encontrada. No entanto, podemos configurar para o método um valor padrão que previne o erro KeyError. Isso pode ser feito de duas maneiras:
# Usando um valor que retorna caso a chave não seja encontrada
dictionary.fetch('knife', 'retorno padrão')
#=> "retorno padrão"
# Passando um bloco a ser executado caso a chave não seja encontrada
dictionary.fetch('knife') { |key| "Key #{ key } not found" }
#=> "Key knife not found"
Bonus: fetch_values
Existe também o método fetch_values em Ruby, que aceita mais de uma chave como argumento e retorna os resultados dentro de um array.