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