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