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