Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Metaprogramming in Ruby

Kristen Mills
February 21, 2014

Metaprogramming in Ruby

A presentation on metaprogramming in ruby

Kristen Mills

February 21, 2014
Tweet

Other Decks in Technology

Transcript

  1. Blocks That do...end thing or curly braces if on one

    line One of the 3 types of closures
  2. Monkey Patching by example c l a s s S

    t r i n g d e f m y _ m e t h o d " m y _ m e t h o d i s a c o o l m e t h o d " e n d e n d ' a b c ' . m y _ m e t h o d # = > " m y _ m e t h o d i s a c o o l m e t h o d "
  3. attr_accessor d e f a t t r _ a

    c c e s s o r ( * a r g s ) a r g s . e a c h d o | a r g | d e f i n e _ m e t h o d ( a r g ) d o i n s t a n c e _ v a r i a b l e _ g e t ( : " @ # { a r g } " ) e n d d e f i n e _ m e t h o d ( : " # { a r g } = " ) d o | v a l u e | i n s t a n c e _ v a r i a b l e _ s e t ( : " @ # { a r g } " , v a l u e ) e n d e n d e n d
  4. Accessing the Eigenclass e i g e n c l

    a s s = c l a s s < < o b j c l a s s < < a n _ o b j e c t # y o u r c o d e h e r e e n d
  5. Vending Machine f i n i t e i n

    i t i a l : : i d l e d o b e f o r e : i d l e d o @ c u r r e n t _ m o n e y = 0 e n d a f t e r : a c c e p t i n g d o p u t s " C u r r e n t a m o u n t i n m a c h i n e : $ % . 2 f " % @ c u r r e n t _ m o n e y e n d @ m o n e y . e a c h d o | e v e n t _ n a m e , a m o u n t | e v e n t : " i n s e r t _ # { e v e n t _ n a m e } " d o b e f o r e d o p u t s " A d d i n g # { e v e n t _ n a m e } " a d d _ m o n e y ( a m o u n t ) e n d g o f r o m : : i d l e , t o : : a c c e p t i n g g o f r o m : : a c c e p t i n g , t o : : a c c e p t i n g e n d e n d @ p r o d u c t s . e a c h d o | e v e n t _ n a m e , p r i c e | e v e n t : " b u y _ # { e v e n t _ n a m e } " d o b e f o r e { p u t s " B u y i n g # { e v e n t _ n a m e } " } g o f r o m : : a c c e p t i n g , t o : : v e n d i n g , i f : l a m b d a { @ c u r r e n t _ m o n e y > = p r i c e } a f t e r d o @ c u r r e n t _ m o n e y - = p r i c e e n d e n d e n d e v e n t : c o m p l e t e _ v e n d d o b e f o r e { p u t s " R e t u r n i n g $ % . 2 f t o t h e c u s t o m e r " % @ c u r r e n t _ m o n e y } g o f r o m : : v e n d i n g , t o : : i d l e e n d e v e n t : p r e s s _ c o i n _ r e t u r n d o
  6. add_event d e f a d d _ e v

    e n t ( e v e n t _ n a m e , & b l o c k ) # S o m e o t h e r s t u f f h a p p e n s b e f o r e h e r e @ c l a s s . s e n d ( : d e f i n e _ m e t h o d , : " c a n _ # { e v e n t _ n a m e } ? " ) d o e v e n t . t r a n s i t i o n s . k e y ? c u r r e n t _ s t a t e . n a m e e n d @ c l a s s . s e n d ( : d e f i n e _ m e t h o d , : " # { e v e n t _ n a m e } " ) d o i f e v e n t . t r a n s i t i o n s . k e y ? c u r r e n t _ s t a t e . n a m e t r a n s i t i o n = e v e n t . t r a n s i t i o n s [ c u r r e n t _ s t a t e . n a m e ] u n l e s s t r a n s i t i o n . c o n d i t i o n . n i l ? o r s e l f . i n s t a n c e _ e x e c ( & t r a n s i t i o n . c o n d i t i o n ) r a i s e E r r o r . n e w ( ' D o e s n o t m e e t t h e t r a n s i t i o n c o n d i t i o n ' ) e n d n e w _ s t a t e = s t a t e s [ e v e n t . t r a n s i t i o n s [ c u r r e n t _ s t a t e . n a m e ] . t o ] e v e n t . c a l l b a c k s [ : b e f o r e ] . e a c h d o | c a l l b a c k | s e l f . i n s t a n c e _ e v a l & c a l l b a c k e n d # M o r e c a l l b a c k s h a p p e n h e r e @ c u r r e n t _ s t a t e = n e w _ s t a t e # M o r e C a l l b a c k s h a p p e h e r e e v e n t . c a l l b a c k s [ : a f t e r ] . e a c h d o | c a l l b a c k | s e l f . i n s t a n c e _ e v a l & c a l l b a c k e n d s e l f e l s e r a i s e E r r o r . n e w ' I n v a l i d T r a n s i t i o n ' e n d e n d e n d