Hello -- On Sun, 25 Feb 2001, Clemens Wyss wrote: > Hi all, > the following code (part of this is from "Programming Ruby"): [...] > Produces the following error: > D:\Projekte\rubychannel\ProgrammingRuby\html\test.rb:34:in `eval': > (eval):15:in `getBinding': undefined method `doc' for Test::Example:Class > (NameError) > from D:\Projekte\rubychannel\ProgrammingRuby\html\test.rb:34 > > This does not happen when eval-uating in the default-(i.e. main-)context. > > Is this a bug or an executing context related feature? I believe it's all feature. Here's a stripped-down little test: content = ' class Module p self def doc(s) puts s end end class Example doc("Doc...") end ' class Test def getBinding binding end end eval(content, Test.new.getBinding) Output: Test::Module wyss.rb:21:in `eval': (eval):11:in `getBinding': undefined method `doc' for Test::Example:Class (NameError) from wyss.rb:21 The eval is bound to the context of class Test -- so when the string gets eval'd, the class you're modifying is class Test::Module, not of class Module. This becomes visible through several ways of forcing it to work. (All of these are geared toward my simplified example -- I haven't fitted them to yours, but I think the principles are the same.) 1. Rewrite class Example: class Example Test::Module.new.doc("Doc...") end Output: Test::Module Doc... 2. Rewrite class Test: class Test def getBinding Object.module_eval "binding" end end Output: Module Doc... 3. Do the one-argument test first: eval(content) eval(content, Test.new.getBinding) Output: Module Doc... Test::Module Doc... None of these methods (except #2, maybe?) are very sound or practical, but they show what (I think) is going on. David -- David Alan Black home: dblack / candle.superlink.net work: blackdav / shu.edu Web: http://pirate.shu.edu/~blackdav