Hi List,
In trying to get rubygems working with 1.9 I ran accross an error
regarding the method "Module#define_method". Investigating further
using the ri documentation I found out that the sample code
(specifically the "send hack") doesn't work anymore with 1.9.
Can someone give me an indication of how things have changed. Perhaps
then we can update the documentation as well.
Thanks in advance.
Regards,
Emiel van de Laar
spitfire% ~/usr/bin/ri -v define_method
ri v1.0.1 - 20041108
spitfire% ~/usr/bin/ri define_method
--------------------------------------------------- Module#define_method
define_method(symbol, method) => new_method
define_method(symbol) { block } => proc
------------------------------------------------------------------------
Defines an instance method in the receiver. The _method_ parameter
can be a +Proc+ or +Method+ object. If a block is specified, it is
used as the method body. This block is evaluated using
+instance_eval+, a point that is tricky to demonstrate because
+define_method+ is private. (This is why we resort to the +send+
hack in this example.)
class A
def fred
puts "In Fred"
end
def create_method(name, &block)
self.class.send(:define_method, name, &block)
end
define_method(:wilma) { puts "Charge it!" }
end
class B < A
define_method(:barney, instance_method(:fred))
end
a = B.new
a.barney
a.wilma
a.create_method(:betty) { p self }
a.betty
_produces:_
In Fred
Charge it!
#<B:0x401b39e8>
spitfire% cat define_method_example.rb
class A
def fred
puts "In Fred"
end
def create_method(name, &block)
self.class.send(:define_method, name, &block)
end
define_method(:wilma) { puts "Charge it!" }
end
class B < A
define_method(:barney, instance_method(:fred))
end
a = B.new
a.barney
a.wilma
a.create_method(:betty) { p self }
a.betty
spitfire% ruby -v define_method_example.rb
ruby 1.8.4 (2005-12-24) [i386-freebsd5]
In Fred
Charge it!
#<B:0x80760d0>
spitfire% ~/usr/bin/ruby -v define_method_example.rb
ruby 1.9.0 (2006-02-22) [i386-freebsd5.3]
In Fred
Charge it!
define_method_example.rb:6:in `Kernel#send': private method `define_method' called for B:Class (NoMethodError)
from define_method_example.rb:6:in `A#create_method'
from define_method_example.rb:19