Usando Keyword Arguments

Tutoriais - 14/Ago/2019 - por Campus Code

Usando Keyword Arguments

A versão Ruby 2.1 introduziu suporte aos keyword arguments, que permitem ao programador passar parâmetros "nomeados". Vamos ver como isso funciona.

Suponha que você quer um parâmetro opcional dentro do método pagar. Para isso, você faria:

def pagar(valor, forma_pagto = 'boleto')
 puts "Pagando R$#{valor} com #{forma_pagto}"
end

pagar(1000)
#=> Pagando R$1000 com boleto

O código acima não tem nenhum problema, mas requer que você conheça, no mínimo, quais são os parâmetros e em qual ordem eles são esperados:

pagar('cartão', 1000)
#=> Pagando R$cartão com 1000

Nesse caso os keyword arguments ajudam muito! Veja o exemplo:

def pagar(valor:, forma_pagto: 'boleto')
  puts "Pagando R$#{valor} com #{forma_pagto}"
end

pagar(1000)
#=>BOOOOM! ArgumentError: wrong number of arguments (given 1, expected 0)

pagar(valor: 1000)
#=> Pagando R$1000 com boleto

pagar(forma_pagto: 'Cartão', valor: 1300)
#=> Pagando R$1300 com Cartão

Veja que na segunda execução do método pagar nós passamos os parâmetros em ordem diferente da qual eles foram declarados e ainda assim o método funcionou como esperado.

Você já escreveu muitos códigos com argumentos posicionais e não viu nenhum problema nisso. Pois é, os problemas começam quando outro programador (ou o você de amanhã) precisa usar esse código:

def meu_link_to(url_or_path, text, css, *options)
 # implentacao por conta da imaginação
end

meu_link_to('Texto', posts_path, "post_link")
#=> <a class="post_link" href="Texto">/posts</a>

Um pouco estranho, não? Durante a implementação, você achou que colocar o path ou url como primeiro argumento faria todo sentido, mas esqueceu disso quando foi utilizar o método. É a vida, não é mesmo?!

Considerações

Não há reais motivos para você sair refatorando todos os seus códigos agora, mas é bom considerar keyword arguments quando implementar métodos em que a ordem dos argumentos não é tão intuitiva quanto parece à primeira vista.

Uma boa regra é: poucos argumentos (1 ou 2) que façam sentido na ordem que você implementou não são necessariamente candidatos para keyword arguments. Métodos com 3 ou mais argumentos podem ser candidatos a um belo Refactoring, mas isso é assunto para outro post.

;)

Referências

Campus Code