On 4/22/06, dblack / wobblini.net <dblack / wobblini.net> wrote: > Hi -- > > On Sat, 22 Apr 2006, Pat Maddox wrote: > > > On 4/22/06, Sean O'Halpin <sean.ohalpin / gmail.com> wrote: > >> On 4/22/06, Pat Maddox <pergesu / gmail.com> wrote: > >> > >>> Can someone explain to me what the difference is between the inline > >>> code example, and specifying it inside the class? > >> > >> A class definition introduces a new scope (similar to def) so for your > >> example to work you need to define the local variable ~within~ the > >> class definition for it to be visible from the closure, e.g. > >> > >> class A > >> var = "initialized variable" > >> class_eval { define_method(:talk) { puts var } } > >> end > >> > >> A.new.talk > >> > >> #=> initialized variable > >> > >> Regards, > >> > >> Sean > >> > >> > > > > The point of this is to be able to access 'var' even though it's > > normally outside of the class's scope. See the very first example, > > which does this. > > But look closely at it: > > irb(main):001:0> var = "initialized variable" > => "initialized variable" > irb(main):002:0> class C; end > => nil > irb(main):003:0> C.class_eval { define_method("talk") { puts var } } > => #<Proc:0x00355c30@(irb):3> > irb(main):004:0> C.new.talk > initialized variable > > The variable var is defined at the top level, and the call to > class_eval takes place at the top level. So var is in scope, and can > be used inside the class_eval block. > > In your example, var is on one side of a class keyword, and the use of > var is on the other. What you've done is like: > > var = 1 > class C > puts var > end > > which will give you the same error. > > > David > > -- > David A. Black (dblack / wobblini.net) > Ruby Power and Light, LLC (http://www.rubypowerandlight.com) > > "Ruby for Rails" PDF now on sale! http://www.manning.com/black > Paper version coming in early May! > > Okay, that makes sense now. I think that's what Sean was telling me as well...I just didn't get it as quickly. Thanks for the explanation. Pat