Estou tendo dificuldades para entender o attr_accessor
em Ruby. Alguém me pode explicar isto?
attr_accessor é justamente um método. (O link deve fornecer mais informações sobre como ele funciona - veja os pares de métodos gerados, e um tutorial deve mostrar como usá-lo).
O truque é que class
não é definição em Ruby (é " apenas uma definição" em linguagens como C++ e Java), mas é uma expressão que avalia. É durante esta avaliação quando o método attr_accessor
é invocado, o que por sua vez modifica a classe atual - lembre-se do receptor implícito: self.attr_accessor
, onde self
é o "open" objeto de classe neste ponto.
A necessidade de attr_accessor
e amigos, é, bem:
Ruby, como Smalltalk, não permite que variáveis de instância sejam acessadas fora dos métodos1 para aquele objeto. Ou seja, variáveis de instância não podem ser acessadas na forma x.y
como é comum, por exemplo, Java ou mesmo Python. Em Ruby y
é sempre tomado como uma mensagem para enviar (ou "método para chamar"). Assim, os métodos attr_*
criam wrappers que provêem o acesso à instância @variavel
através de métodos dinamicamente criados.
A placa da caldeira é uma porcaria.
Espero que isto clarifique alguns dos pequenos detalhes. Feliz codificação.
1 Isto é't estritamente verdade e existem algumas "técnicas" em torno disto, mas não há suporte de sintaxe para "variável de instância pública" acesso.