26
Voodoo é pra jacu! metaprogramação em ruby Leonardo Bessa [email protected] @leobessa David Paniz [email protected] @davidpaniz www.davidpaniz.com

Ruby + Rails no Mundo Real 2010 - Voodoo é pra Jacu - Entendendo metaprogramação em ruby

Embed Size (px)

DESCRIPTION

Palestra apresentada durante o evento Ruby + Rails no Mundo Real 2010. Entendendo, de verdade, como funciona metaprogramação em ruby e desmistificando o que normalmente chamam de magia negra.

Citation preview

Page 2: Ruby + Rails no Mundo Real 2010 - Voodoo é pra Jacu - Entendendo metaprogramação em ruby

Metaprogramação é a programação de programas que escrevem ou manipulam outros programas (ou a

si próprios) assim como seus dados

O que é metaprogramação?

Page 3: Ruby + Rails no Mundo Real 2010 - Voodoo é pra Jacu - Entendendo metaprogramação em ruby

Metaprogramming is writing code that writes code

O que é metaprogramação?

Metaprogramming is writing code that manipulates language

constructs at runtime

Page 4: Ruby + Rails no Mundo Real 2010 - Voodoo é pra Jacu - Entendendo metaprogramação em ruby

Qual a tarifa agora?

Page 5: Ruby + Rails no Mundo Real 2010 - Voodoo é pra Jacu - Entendendo metaprogramação em ruby

5

class Calculator def calculate(time) if (7...21).include?(time.hour) 1 else 0.5 end endend

p Time.now.tarifa

Page 6: Ruby + Rails no Mundo Real 2010 - Voodoo é pra Jacu - Entendendo metaprogramação em ruby

6

class Time def tarifa if (7...21).include?(hour) 1 else 0.5 end endend

p Time.now.tarifa

Page 7: Ruby + Rails no Mundo Real 2010 - Voodoo é pra Jacu - Entendendo metaprogramação em ruby

"I invented the term Object-Oriented, and I can tell you I did not have C++ in mind." -

Alan Kay

Page 8: Ruby + Rails no Mundo Real 2010 - Voodoo é pra Jacu - Entendendo metaprogramação em ruby

class

Page 9: Ruby + Rails no Mundo Real 2010 - Voodoo é pra Jacu - Entendendo metaprogramação em ruby

class

Page 10: Ruby + Rails no Mundo Real 2010 - Voodoo é pra Jacu - Entendendo metaprogramação em ruby
Page 11: Ruby + Rails no Mundo Real 2010 - Voodoo é pra Jacu - Entendendo metaprogramação em ruby

Codando...

Page 12: Ruby + Rails no Mundo Real 2010 - Voodoo é pra Jacu - Entendendo metaprogramação em ruby

woody.class == amigo.class

Page 13: Ruby + Rails no Mundo Real 2010 - Voodoo é pra Jacu - Entendendo metaprogramação em ruby
Page 14: Ruby + Rails no Mundo Real 2010 - Voodoo é pra Jacu - Entendendo metaprogramação em ruby
Page 15: Ruby + Rails no Mundo Real 2010 - Voodoo é pra Jacu - Entendendo metaprogramação em ruby

• Eu realmente posso adicionar um método a um único objeto?

• Onde o método está?

• Que tipo de objeto pode definir um método?

Criação de métodos

Page 16: Ruby + Rails no Mundo Real 2010 - Voodoo é pra Jacu - Entendendo metaprogramação em ruby

• Também conhecidas como Metaclass, Eigenclass, etc

• É uma classe como outra qualquer, mas escondida

• Existe uma para cada objeto (lazy)

Singleton Class

Page 17: Ruby + Rails no Mundo Real 2010 - Voodoo é pra Jacu - Entendendo metaprogramação em ruby
Page 18: Ruby + Rails no Mundo Real 2010 - Voodoo é pra Jacu - Entendendo metaprogramação em ruby

Qual é a Singleton Class

class << self self end

Page 19: Ruby + Rails no Mundo Real 2010 - Voodoo é pra Jacu - Entendendo metaprogramação em ruby

Qual é a Singleton Class

class Object def singleton_class class << self self end endend

Page 20: Ruby + Rails no Mundo Real 2010 - Voodoo é pra Jacu - Entendendo metaprogramação em ruby

Codando...

Page 21: Ruby + Rails no Mundo Real 2010 - Voodoo é pra Jacu - Entendendo metaprogramação em ruby

Como logar a chamada de um método?

Page 22: Ruby + Rails no Mundo Real 2010 - Voodoo é pra Jacu - Entendendo metaprogramação em ruby

alias :new_name :old_name

Page 23: Ruby + Rails no Mundo Real 2010 - Voodoo é pra Jacu - Entendendo metaprogramação em ruby

Que tal só ‘log :voar’?

Page 24: Ruby + Rails no Mundo Real 2010 - Voodoo é pra Jacu - Entendendo metaprogramação em ruby

Abrindo a classe...

Page 25: Ruby + Rails no Mundo Real 2010 - Voodoo é pra Jacu - Entendendo metaprogramação em ruby

E se eu quiser logar mais de método?

Page 26: Ruby + Rails no Mundo Real 2010 - Voodoo é pra Jacu - Entendendo metaprogramação em ruby

Generalização