Named Parameter em Ruby

Introdução

Depois de me cansar daquela gambiarra de usar hash para simular named parameter em ruby, decidi criar uma gem para amenizar a trabalhosa gambiarra.

Instalando

Antes de qualquer coisa temos que instalar a gem named_parameter:

gem install named_parameter

Como Usar

O Básico

Após instalar a gem, só o que precisamos fazer é extender o módulo NamedParameter e em troca ganharemos o método named que usaremos antes da definição do método para dizer que este terá parâmetros nomeados, dessa maneira:

1
2
3
4
5
6
7
8
9
10
11
12
require 'rubygems'
require 'named_parameter'

class Pessoa
  extend NamedParameter

  named def fala(frase)
    puts "Pessoa falou: #{frase}"
  end
end

Pessoa.new.fala frase: "Legal!" # => Pessoa falou: Legal!

Se esse mesmo código fosse implementado da forma tradicional seria assim:

1
2
3
4
5
6
7
8
9
class Pessoa

  def fala(args={})
    frase = args[:frase]
    puts "Pessoa falou: #{frase}"
  end
end

Pessoa.new.fala frase: "Nem tao legal :(" # => Pessoa falou: Nem tao legal :(

Parâmetros Opcionais

Caso queiramos utilizar parâmetros opcionais, não teremos problema:

1
2
3
4
5
6
7
8
9
10
11
12
13
require 'rubygems'
require 'named_parameter'

class Pessoa
  extend NamedParameter

  named def fala(frase="Estou Mudo")
    puts "Pessoa falou: #{frase}"
  end
end

Pessoa.new.fala # => Pessoa falou: Estou Mudo
Pessoa.new.fala frase: "Muito Legal!" # => Pessoa falou: Muito Legal!

Múltiplos Parâmetros

Também podemos definir múltiplos parâmetros:

1
2
3
4
5
6
7
8
9
10
11
12
13
require 'rubygems'
require 'named_parameter'

class Ponto
  extend NamedParameter

  named def mover_para(x,y,z=0)
    puts "Movido para: [#{x},#{y},#{z}]"
  end
end

Ponto.new.mover_para(y: 30,x: 50) # => Movido para: [50,30,0]
Ponto.new.mover_para(z: 10, y: 30,x: 50) # => Movido para: [50,30,10]

Cuidado!

Antes de usar esta gem, lembre-se que ao extender o módulo NamedParameter, o callback method_added é sobreescrito. Caso seja necessário sobreescrever esse callback e usar o NamedParameter na mesma classe é necessário utilizar around alias!

Conclusão

O código fonte da gem está no github: https://github.com/HugoLnx/named_parameter. Os testes foram escritos utilizando RSpec. Quem quiser contribuir pode mandar um pull request (com testes por favor).

Referências