On 10/25/2010 10:05 AM, Jes Gabriel y Gal wrote:
> On Mon, Oct 25, 2010 at 4:03 PM, Andy Frank <ridingwithrails / gmail.com> wrote:
>> I am experimenting with a test class to figure out why self.class_eval
>> does not seem to work.  Please see code below:
>>
>>  class Xclass
>>         def add_method(meth, work)
>>          self.class_eval %Q{
>>                 def #{meth}
>>                         #{work}
>>                 end
>>                 }
>>         end
>> end
>>
>> This throws an error when I call the class like so:
>>
>> x = Xclass.new
>> x.add_method("add", "puts \"Hello World\"")
>>
>>
>> Error:
>> rb:3:in `add_method': undefined method `class_eval' for #
>> (NoMethodError)
>>  from test_dyn.rb:15:in `'
>>
>>
>> The fix has been to change self.class_eval  to Xclass.class_eval.
>> Anyone know why this is the case. Shouldn't self work.
> 
> You can also use self.class.class_eval:
> 
> irb(main):001:0> class Xclass
> irb(main):002:1> def add_method(meth,work)
> irb(main):003:2> self.class.class_eval %Q{
> irb(main):004:2" def #{meth}
> irb(main):005:2" #{work}
> irb(main):006:2" end
> irb(main):007:2" }
> irb(main):008:2> end
> irb(main):009:1> end
> => nil
> irb(main):010:0> x = Xclass.new
> => #<Xclass:0xb74f77b8>
> irb(main):011:0> x.add_method("add", 'puts "hello world"')
> => nil
> irb(main):012:0> x.add
> hello world

Or you can just use eval instead of class_eval in this case:

irb(main):001:0> class Xclass
irb(main):002:1> def add_method(meth, work)
irb(main):003:2> eval %Q{
irb(main):004:2" def #{meth}
irb(main):005:2" #{work}
irb(main):006:2" end
irb(main):007:2" }
irb(main):008:2> end
irb(main):009:1> end
=> nil
irb(main):010:0> x = Xclass.new
=> #<Xclass:0x7ff80244>
irb(main):011:0> x.add_method("add", 'puts "hello world"')
=> nil
irb(main):012:0> x.add
hello world

-Jeremy