Hi --

On Mon, 23 Jun 2008, Luca Scaljery wrote:

> Hi All
>
> I'm trying to add methods to a class like:
>
> class Person
>  def refresh
>    p "refresh"
>  end
>  def dup
>    P "DUP"
>  end
>
>  TIMED_M =  [:refresh, :dup]
>  TIMED_M.each do  |method|
>    p method
>    alias_method :"#{method}_without_timing", method
>
>    define_method :"{#method}_with_timing" do
>      p "timing"
>      start_time = Time.now.to_f
>      returning(self.send(:"#{method}_without_timing")) do
>        end_time = Time.now.to_f
>        puts "#{method}: #{"%.3f" % (end_time - start_time)} s."
>      end
>    end
>  end
> end
>
> class << Person
>  def start_trace
>    TIMED_M.each do |method|
>      p "x"
>      alias_method method, :"#{method}_with_timing"
>    end
>  end
> end
> p = Person.new
> p.refresh
> Person.start_trace
> p.refresh
>
> For some unknown reason I get the following error:
> :refresh
> :dup
> "refresh"
> ./t2.rb:31:in `start_trace': uninitialized constant Class::TIMED_METHODS
> (NameError)
>  from ./t2.rb:39
>
> Any suggestions why I get this error ?

Here's a boiled-down version:

irb(main):001:0> class C; X = 1; end
=> 1
irb(main):002:0> class << C; X; end
NameError: uninitialized constant Class::X

The reason is that there's no constant X in the singleton class of C.

I also suspect that what's above is not actually cut-and-pasted, since
you don't actually use "TIMED_METHODS" anywhere :-)


David

-- 
Rails training from David A. Black and Ruby Power and Light:
   ADVANCING WITH RAILS   June 16-19           Berlin
   ADVANCING WITH RAILS   July 21-24           Edison, NJ
See http://www.rubypal.com for details and updates!