Ruby, metaprogramação e convenções

Posted on March 28, 2009

1


Metaprogramação (metaprogramming) é a técnica de utilizar código para gerar código.
Uma linguagem onde o metaprograma é escrito é chamado de metalinguagem.
A linguagem Ruby é dinâmica ao extremo, permitindo que sejam criados métodos em outros objetos.

Vamos criar uma classe Carro vazia. E uma classe Oficina, essa por sua vez sabe turbinar um carro:


class Carro
end


class Oficina
def turbina(carro)
def carro.turbo
puts "turbinado!!"
end
end
end

Se instanciarmos um objeto Carro e chamarmos o método turbina, evidentemente ele não existe, porém podemos fazer com que a classe oficina crie o método no nosso objeto:

c = Carro.new
oficina = Oficina.new
oficina.turbina c
c.turbo

# => turbinado!!

Outra coisa interessante é são as convenções de métodos que mudam o estado de objetos, colocando o caracter “!” (bang) para informar o efeito colateral.
Vamos criar o método “pinta” na Oficina e um construtor na classe carro obrigando a passar a cor.


class Carro
attr_accessor :cor
def initialize(cor)
@cor = cor
end
end


class Oficina
def pinta!(carro)
carro.cor = 'azul'
end
def turbina(carro)
def carro.turbo
puts "turbinado!!"
end
end
end

c = Carro.new('verde')
puts c.cor
oficina = Oficina.new
oficina.turbina c
c.turbo
oficina.pinta! c
puts c.cor

#=> verde
#=> turbinado!!
#=> azul

Metaprogramação e as convenções da linguagem ruby são extremamente úteis para chegar na melhor legibilidadede código possível com Ruby.

Posted in: ruby