#6 Metaprogramação: Definindo Classes

Posted on February 20, 2010

1


Algumas pessoas tem comentado que os conceitos de metaprogramação tem ajudado na quebra de paradigma de Ruby e suas linguagens anteriores, como Java ou C#.

De fato as diferenças são grandes e aqui vai mais uma delas. Em linguagens como Java e C#, ao definir uma classe você está dizendo ao compilador: “Ei compilador, quando eu criar um objeto desse tipo, ele deve se comportar dessa forma“.

Em Ruby isso é diferente. Ao definir uma classe você está rodando código.

ps: Tudo que for aplicado aqui em classes também é aplicável em módulos.

Definindo classes

Em Ruby, uma classe não é um lugar onde você apenas coloca métodos. Você pode retornar valores em uma classe, como em métodos. Além disso, classes(e módulos) são muitas vezes o objeto corrente (self), afinal, classes também são objetos.

Em Ruby você sempre tem um objeto corrente, sempre existe o self, e consequentemente uma classe. Lembre-se que sempre que você define um método, você está definindo um método de instância.

Você já deve ter visto o básico sobre adicionar métodos em tempo de execução, mas existem outras formas. Uma forma importante é conhecer o método class_eval.

Assim como o instance_eval, o método class_eval pode mudar o comportamento de um objeto corrente (self), mas além disso, pode mudar também o comportamento da classe de desse objeto:

Variáveis de instância da classe

Como classes são objetos, nada proibe que a classe tenha então suas próprias variáveis de instância:

PS: se voce vem do java, não confunda com static. A classe criada é uma instância da classe Class. (Vale dar uma lida nessa parte da documentação).

PS: Esse post é uma preparação para o próximo sobre singleton classes e methods. Sugiro a leitura do post “Onde posso usar singleton classes?“.

Continua
Próximo post – Eigenclasses