Class_eval

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?!

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

=> #<Proc:0x1016a660@(irb):14>

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 #<Foo:0x100c3d58>
        from (irb):20

Foo.ban

=> "ban">> Foo.instance_eval "def borg() 'org' end"
=> nil

Foo.new.borg

NoMethodError: undefined method `borg' for #<Foo:0x101b4e50>
        from (irb):23

Foo.borg

=> "org"

HTH

Kind regards

    robert

···

from :0