Home > Palestras / Apresentações, Rails, Ruby > Metaprogramação em Ruby – Magia negra não existe

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)