O que é attr_accessor em Ruby?

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:

  1. 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.

  2. 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.

Comentários (2)

O attr_accessor é muito simples:

attr_accessor :foo

é um atalho para:

def foo=(val)
  @foo = val
end

def foo
  @foo
end

nada mais é do que um getter/setter para um objecto

Comentários (2)

Basicamente eles falsificam atributos de dados acessíveis ao público, que o Ruby não't tem.

Comentários (3)