Metaprogramação em Ruby – Magia negra não existe
Ontem, dia 06/12 ocorreu o nosso segundo techday da Caelum no qual eu e o Leonardo Bessa, que também é consultor e instrutor da Caelum, fizemos uma apresentação sobre metaprogramação em ruby sob o título “Voodoo é pra jacu” (Sim, foi por causa do picapau).
Como apenas os slides e o código gerado não transmitem tanto conhecimento estou aproveitando pra deixar alguns posts e vídeos sobre o assunto que serviram de base de estudo para a preparação da nossa apresentação.
Código gerado durante a aprensentação:
class Picapau
def voa
p 'estou voando'
end
end
woody = Picapau.new
amigo = Picapau.new
woody.voa # => estou voando
amigo.voa # => estou voando
def woody.rir
"hehehehe-hehehehe-hehehehehehe"
end
p woody.rir # => hehehehe-hehehehe-hehehehehehe
# p amigo.rir # => NoMethodError: undefined method ‘rir’ for ...
p woody.class # => Picapau
p amigo.class # => Picapau
p woody.class == amigo.class # => true
p woody.methods - amigo.methods # => ["rir"]
p woody.singleton_methods # => ["rir"]
p amigo.singleton_methods # => []
class Object
def singleton_class
class << self
self
end
end
end
p woody.singleton_class # => Class:Picapau:0x...
p amigo.singleton_class # => Class:Picapau:0x...(diferente)
p woody.singleton_class == amigo.singleton_class # => false
class ARBase
def self.belongs_to
def leo
p 'leo'
end
end
end
class B < ARBase
belongs_to
end
B.new.leo # => leo
slides:
links sobre o assunto:
Uma apresentação do Dave Thomas (em inglês)
Post do Katz sobre self (inglês) – tradução
Contextos implicitos (resposta ao post do Katz) – tradução
O que é metaclass por Jim Weirich com direito a comentário do Ola Bini (apenas em inglês)
Umas dicas do Sidu Ponnappa pra entender melhor o funcionamento interno do ruby (apenas em inglês)
