Skip to content

Instantly share code, notes, and snippets.

@indirect
Created February 13, 2010 06:57
Show Gist options
  • Save indirect/303303 to your computer and use it in GitHub Desktop.
Save indirect/303303 to your computer and use it in GitHub Desktop.
the difference between class Foo, Foo.class_eval, and Foo.instance_eval
module TopLevel
class Foo
puts "class Foo"
puts "self: #{self}"
puts "nesting: #{Module.nesting.inspect}"
puts "Method definition context: #{self}"
end
puts
Foo.class_eval do
puts "Foo.class_eval"
puts "self: #{self}"
puts "nesting: #{Module.nesting.inspect}"
puts "Method definition context: #{self}"
end
puts
class << Foo
puts "class << Foo"
puts "self: #{self}"
puts "nesting: #{Module.nesting.inspect}"
puts "Method definition context: #{self}"
end
puts
Foo.instance_eval do
puts "class << Foo"
puts "self: #{self}"
puts "nesting: #{Module.nesting.inspect}"
puts "Method definition context: #{class << self; self; end}"
end
puts
Foo.new.instance_eval do
puts "Foo.new"
puts "self: #{self}"
puts "nesting: #{Module.nesting.inspect}"
puts "Method definition context: #{class << self; self; end}"
end
end
class Foo
self: TopLevel::Foo
nesting: [TopLevel::Foo, TopLevel]
Method definition context: TopLevel::Foo
Foo.class_eval
self: TopLevel::Foo
nesting: [TopLevel]
Method definition context: TopLevel::Foo
class << Foo
self: #<Class:TopLevel::Foo>
nesting: [#<Class:TopLevel::Foo>, TopLevel]
Method definition context: #<Class:TopLevel::Foo>
class << Foo
self: TopLevel::Foo
nesting: [TopLevel]
Method definition context: #<Class:TopLevel::Foo>
Foo.new
self: #<TopLevel::Foo:0x10012be38>
nesting: [TopLevel]
Method definition context: #<Class:#<TopLevel::Foo:0x10012be38>>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment