basics of metaprogramming in ruby

15
Basics of Metaprogramming Tamás Tompa (Digital Natives) [email protected] Budapest Ruby Meetup 2013 02/10/2013 Thursday, October 3, 13

Upload: digital-natives

Post on 16-May-2015

311 views

Category:

Technology


2 download

DESCRIPTION

budapest ruby meetup, 10/2013 Tamas Tompa

TRANSCRIPT

Page 1: Basics of Metaprogramming in Ruby

Basics of MetaprogrammingTamás Tompa (Digital Natives)

[email protected]

Budapest Ruby Meetup 2013

02/10/2013

Thursday, October 3, 13

Page 2: Basics of Metaprogramming in Ruby

“Metaprogramming is writing code that writes code.”

Thursday, October 3, 13

Page 3: Basics of Metaprogramming in Ruby

what for?§ examples

§ writing a wrapper§ DSL (domain specific language)§ keep your code DRY§ extend core ruby classes

Thursday, October 3, 13

Page 4: Basics of Metaprogramming in Ruby

runtime§ static vs dynamic metaprogramming§ everything is object (even classes)§ code introspection

Thursday, October 3, 13

Page 5: Basics of Metaprogramming in Ruby

well known example§ ActiveRecord::Base

§ reads the schema at runtime§ discovers fields§ conventions

Thursday, October 3, 13

Page 6: Basics of Metaprogramming in Ruby

monkey patching§ monkey patch is a way to extend or

modify the run-time code of dynamic languages without altering the original source code

§ can be dangerous§ always carefully check the existing

methods

Thursday, October 3, 13

Page 7: Basics of Metaprogramming in Ruby

basicsobj = MyClass.newobj.class # => MyClass

"hello".class # => StringString.class # => Class

obj.instance_variables # => [:@v]

obj.methods.grep(/my/) # => [:my_method]

Class.instance_methods(false)

Thursday, October 3, 13

Page 8: Basics of Metaprogramming in Ruby

basics# ignore inherited methodsClass.instance_methods(false)

String.superclass # => ObjectObject.superclass # => BasicObjectBasicObject.superclass # => nil

# module and kernelD.ancestors # => [D, C, M, Object, Kernel, BasicObject]

Thursday, October 3, 13

Page 9: Basics of Metaprogramming in Ruby

“Classes themselves are nothing but objects.”

Thursday, October 3, 13

Page 10: Basics of Metaprogramming in Ruby

object model

Thursday, October 3, 13

Page 11: Basics of Metaprogramming in Ruby

dynamic methodsclass MyClass

define_method :my_method do |my_arg|

my_arg * 3

end

end

obj = MyClass.new

obj.my_method(2) # => 6

obj.send(:my_method, 2) # => 6

Thursday, October 3, 13

Page 12: Basics of Metaprogramming in Ruby

generating methodsclass Computer

def initialize(computer_id, data_source)

end

def self.define_component(name)

define_method(name) do

info = @data_source.send "get_#{name}_info" , @id

price = @data_source.send "get_#{name}_price" , @id

end

end

define_component :mouse

define_component :cpu

end

Thursday, October 3, 13

Page 13: Basics of Metaprogramming in Ruby

method missingclass Lawyer

def method_missing(method, *args)

puts "You called: #{method}(#{args.join(', ')})"

puts "(You also passed it a block)" if block_given?

end

end

bob = Lawyer.new

bob.talk_simple('a' , 'b' ) do

# a block

end

You called: talk_simple(a, b)

(You also passed it a block)

Thursday, October 3, 13

Page 14: Basics of Metaprogramming in Ruby

http://pragprog.com/book/ppmetr/metaprogramming-ruby

Thursday, October 3, 13

Page 15: Basics of Metaprogramming in Ruby

We’re hiring!http://digitalnatives.hu/jobs

Thursday, October 3, 13