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.