From: Robert Klemme Date: 2005-09-27T00:51:43+09:00 Subject: Re: class_eval Derek Chesterfield wrote: > Stealing someone else's recent example code, what is the difference > between this: > >> class A >> def meth2 >> puts "I'm meth2. I try to access something I ain't >> allowed: #{static_var}" >> end >> static_var = 3 >> define_method(:meth3) do >> puts "I'm meth3. I'm allowed to access #{static_var}" >> end >> end >> a = A.new >> a.meth3 >> a.meth2 > > and this, which seems to do the same thing, but without the > class_eval: > >> class B >> def meth2 >> puts "I'm meth2. I try to access something I ain't >> allowed: #{static_var}" >> end >> class_eval do >> static_var = 3 >> define_method(:meth3) do >> puts "I'm meth3. I'm allowed to access #{static_var}" >> end >> end >> end >> b = B.new >> b.meth3 >> b.meth2 > > In other words, what does class_eval do that I'm not understanding?! In this case it's not really interesting to use class_eval. It's more interesting for cases like these >> class Foo;end => nil >> Foo.class_eval do ?> def bar() end >> end => nil >> Foo.new.bar => nil >> Foo.class_eval "def bar() \"bar\" end" => nil >> Foo.new.bar => "bar" >> x=10 => 10 >> Foo.class_eval do ?> define_method(:baz) { puts x } >> end => # >> Foo.new.baz 10 => nil And note the difference to instance_eval: >> Foo.instance_eval do ?> def ban() "ban" end >> end => nil >> Foo.new.ban NoMethodError: undefined method `ban' for # from (irb):20 >> Foo.ban => "ban">> Foo.instance_eval "def borg() 'org' end" => nil >> Foo.new.borg NoMethodError: undefined method `borg' for # from (irb):23 from :0 >> Foo.borg => "org" HTH Kind regards robert