4. Was ist
Metaprogrammierung
• Writing code, that writes code
• Code zur Laufzeit des Programms
generieren und evaluieren
• Klassen und Strukturen zur Laufzeit
verändern
• Metaprogrammierung == Programmierung
38. method_added
• Aufruf beim Hinzufügen einer Methode
• Parameter: name
• nützlich, wenn man eine Methode mit einer
anderen umschließen möchte
39. Beispiel
class Foo
def self.method_added name
alias_method “__old_#{name}__”, name
define_method name do |*args|
puts “called #{name}”
self.send(“__old_#{name}__”, *args)
end
end
end
40. method_missing
• Aufruf, wenn keine Methode gefunden wird
• Parameter: name, *args
• dynamische Methoden erstellen
• wird in vielen Libraries benutzt
41. Beispiel
class Hash
def method_missing name, *args
return super(name, *args)
unless self.include? (name)
self[name]
end
end
42. Beispiel
class Hash
def method_missing name, *args
return super(name, *args)
unless self.include? (name)
self[name]
end
end
{:foo => :bar}.foo # => :bar
47. Beispiel
MyGreatMoneyGem: MyMuchBetterMoneyGem:
class Fixnum class Fixnum
def euro def euro
“#{self} €” Euro.new(self)
end end
# usw. # usw.
end end
48. Lösung
MyGreatMoneyGem: MyMuchBetterMoneyGem:
module MGMG module MMBMG
refine Fixnum do refine Fixnum do
def euro def euro
“#{self}€” Euro.new(self)
end end
# usw. # usw.
end end
end end
49. Anwendung
class ThisClass class ThatClass
using MGMG using MMBMG
def self.do_sth def self.do_sth
5.euro 5.euro
end end
end end
MGMG.do_sth # => 5€ MGMG.do_sth # =>
#<Euro: 0x0......>
50. Scopes
using A #global
module Foo
using B #modulweit
class Bar
using C #klassenweit
def baz
using D #nur innerhalb der Methode
end
end
end
51. Kein local rebinding
class Foo
def bar module Mod
baz refine Foo do
end def baz
“no baz”
def baz end
“baz” end
end end
end