Subsecciones

Definiendo, Suprimiendo y Haciendo Alias de Métodos


Definiendo Métodos con define_method

En Ruby tenemos dos formas de generar métodos dinámicamente: 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:

~/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