define_method
y
eval + def
.
define_method(symbol, method) define_method(symbol) { block } |
class_eval <<-"END" def #{name} # body end END |
define_method
es un método de clase privado y por tanto debe ser invocado sin especificar
el receptor: el destinatario es siempre la clase que esta en contexto.
Los parámetros son:
symbol
especifica el nombre del método.
method
es una lambda
o Proc
o un bloque.
~/chapter8ReflectionandMetaprogramming$ cat -n hashtoclass.rb 1 class MyClass 2 def self.h; @@h end 3 4 print "Write a ruby hash: " 5 @@h = eval gets() 6 7 @@h.keys.each { |k| 8 define_method k do 9 @@h[k] 10 end 11 12 define_method "#{k}=" do |v| 13 @@h[k] = v 14 end 15 } 16 end 17 18 x = MyClass.new 19 print "Action: "; action = gets().chomp 20 if action =~ /=/ 21 print "Value: "; value = eval gets().chomp 22 puts x.send(action, value) 23 else 24 puts x.send(action) 25 end 26 puts MyClass.h.inspect
~/chapter8ReflectionandMetaprogramming$ ruby hashtoclass.rb Write a ruby hash: { :a => 1, :b => 2} Action: b= Value: 45 45 {:a=>1, :b=>45}
define_method
nos permite definir métodos cuyos nombres no se atienen a las reglas convencionales:
>> class Titi >> define_method 'chu$|chu' do ?> puts "in chu$|chu" >> end >> end => #<Proc:0x000000010046d8f8@(irb):33> >> z = Titi.new => #<Titi:0x10046ac20> >> z.send 'chu$|chu' in chu$|chu => nil
Casiano Rodriguez León 2015-01-07