![Page 1: Ruby + Rails no Mundo Real 2010 - Voodoo é pra Jacu - Entendendo metaprogramação em ruby](https://reader033.vdocuments.pub/reader033/viewer/2022042623/545b800daf79592b448b62e8/html5/thumbnails/1.jpg)
Voodoo é pra jacu!metaprogramação em ruby
Leonardo [email protected]
@leobessa
David [email protected]
@davidpanizwww.davidpaniz.com
![Page 2: Ruby + Rails no Mundo Real 2010 - Voodoo é pra Jacu - Entendendo metaprogramação em ruby](https://reader033.vdocuments.pub/reader033/viewer/2022042623/545b800daf79592b448b62e8/html5/thumbnails/2.jpg)
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](https://reader033.vdocuments.pub/reader033/viewer/2022042623/545b800daf79592b448b62e8/html5/thumbnails/3.jpg)
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](https://reader033.vdocuments.pub/reader033/viewer/2022042623/545b800daf79592b448b62e8/html5/thumbnails/4.jpg)
Qual a tarifa agora?
![Page 5: Ruby + Rails no Mundo Real 2010 - Voodoo é pra Jacu - Entendendo metaprogramação em ruby](https://reader033.vdocuments.pub/reader033/viewer/2022042623/545b800daf79592b448b62e8/html5/thumbnails/5.jpg)
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](https://reader033.vdocuments.pub/reader033/viewer/2022042623/545b800daf79592b448b62e8/html5/thumbnails/6.jpg)
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](https://reader033.vdocuments.pub/reader033/viewer/2022042623/545b800daf79592b448b62e8/html5/thumbnails/7.jpg)
"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](https://reader033.vdocuments.pub/reader033/viewer/2022042623/545b800daf79592b448b62e8/html5/thumbnails/8.jpg)
class
![Page 9: Ruby + Rails no Mundo Real 2010 - Voodoo é pra Jacu - Entendendo metaprogramação em ruby](https://reader033.vdocuments.pub/reader033/viewer/2022042623/545b800daf79592b448b62e8/html5/thumbnails/9.jpg)
class
![Page 10: Ruby + Rails no Mundo Real 2010 - Voodoo é pra Jacu - Entendendo metaprogramação em ruby](https://reader033.vdocuments.pub/reader033/viewer/2022042623/545b800daf79592b448b62e8/html5/thumbnails/10.jpg)
![Page 11: Ruby + Rails no Mundo Real 2010 - Voodoo é pra Jacu - Entendendo metaprogramação em ruby](https://reader033.vdocuments.pub/reader033/viewer/2022042623/545b800daf79592b448b62e8/html5/thumbnails/11.jpg)
Codando...
![Page 12: Ruby + Rails no Mundo Real 2010 - Voodoo é pra Jacu - Entendendo metaprogramação em ruby](https://reader033.vdocuments.pub/reader033/viewer/2022042623/545b800daf79592b448b62e8/html5/thumbnails/12.jpg)
woody.class == amigo.class
![Page 13: Ruby + Rails no Mundo Real 2010 - Voodoo é pra Jacu - Entendendo metaprogramação em ruby](https://reader033.vdocuments.pub/reader033/viewer/2022042623/545b800daf79592b448b62e8/html5/thumbnails/13.jpg)
![Page 14: Ruby + Rails no Mundo Real 2010 - Voodoo é pra Jacu - Entendendo metaprogramação em ruby](https://reader033.vdocuments.pub/reader033/viewer/2022042623/545b800daf79592b448b62e8/html5/thumbnails/14.jpg)
![Page 15: Ruby + Rails no Mundo Real 2010 - Voodoo é pra Jacu - Entendendo metaprogramação em ruby](https://reader033.vdocuments.pub/reader033/viewer/2022042623/545b800daf79592b448b62e8/html5/thumbnails/15.jpg)
• 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](https://reader033.vdocuments.pub/reader033/viewer/2022042623/545b800daf79592b448b62e8/html5/thumbnails/16.jpg)
• 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](https://reader033.vdocuments.pub/reader033/viewer/2022042623/545b800daf79592b448b62e8/html5/thumbnails/17.jpg)
![Page 18: Ruby + Rails no Mundo Real 2010 - Voodoo é pra Jacu - Entendendo metaprogramação em ruby](https://reader033.vdocuments.pub/reader033/viewer/2022042623/545b800daf79592b448b62e8/html5/thumbnails/18.jpg)
Qual é a Singleton Class
class << self self end
![Page 19: Ruby + Rails no Mundo Real 2010 - Voodoo é pra Jacu - Entendendo metaprogramação em ruby](https://reader033.vdocuments.pub/reader033/viewer/2022042623/545b800daf79592b448b62e8/html5/thumbnails/19.jpg)
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](https://reader033.vdocuments.pub/reader033/viewer/2022042623/545b800daf79592b448b62e8/html5/thumbnails/20.jpg)
Codando...
![Page 21: Ruby + Rails no Mundo Real 2010 - Voodoo é pra Jacu - Entendendo metaprogramação em ruby](https://reader033.vdocuments.pub/reader033/viewer/2022042623/545b800daf79592b448b62e8/html5/thumbnails/21.jpg)
Como logar a chamada de um método?
![Page 22: Ruby + Rails no Mundo Real 2010 - Voodoo é pra Jacu - Entendendo metaprogramação em ruby](https://reader033.vdocuments.pub/reader033/viewer/2022042623/545b800daf79592b448b62e8/html5/thumbnails/22.jpg)
alias :new_name :old_name
![Page 23: Ruby + Rails no Mundo Real 2010 - Voodoo é pra Jacu - Entendendo metaprogramação em ruby](https://reader033.vdocuments.pub/reader033/viewer/2022042623/545b800daf79592b448b62e8/html5/thumbnails/23.jpg)
Que tal só ‘log :voar’?
![Page 24: Ruby + Rails no Mundo Real 2010 - Voodoo é pra Jacu - Entendendo metaprogramação em ruby](https://reader033.vdocuments.pub/reader033/viewer/2022042623/545b800daf79592b448b62e8/html5/thumbnails/24.jpg)
Abrindo a classe...
![Page 25: Ruby + Rails no Mundo Real 2010 - Voodoo é pra Jacu - Entendendo metaprogramação em ruby](https://reader033.vdocuments.pub/reader033/viewer/2022042623/545b800daf79592b448b62e8/html5/thumbnails/25.jpg)
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](https://reader033.vdocuments.pub/reader033/viewer/2022042623/545b800daf79592b448b62e8/html5/thumbnails/26.jpg)
Generalização