Skip to content

Instantly share code, notes, and snippets.

@NullVoxPopuli
Last active August 29, 2015 14:19
Show Gist options
  • Save NullVoxPopuli/9f89ef70cd2b509cc22c to your computer and use it in GitHub Desktop.
Save NullVoxPopuli/9f89ef70cd2b509cc22c to your computer and use it in GitHub Desktop.
Testing how class_eval and instance_eval affect instances and classes
# colored console output
require 'colorize'
class MyClass
end
def attempt(message)
begin
puts message + ": " + yield.green
rescue => e
puts message + ": " + e.message.red
end
end
# invokes the method on both the instance and class
def run(obj, method_name)
klass = obj.class == Class ? obj : obj.class
instance = obj.class == Class ? klass.new : obj
attempt("klass.#{method_name.to_s}") do
klass.send(method_name)
end
attempt("instance.#{method_name.to_s}") do
instance.send(method_name)
end
end
#instance
me = MyClass.new
me.singleton_class.instance_eval do
define_method(:dynamic_defined) do
"define_method instance_eval"
end
def say_instance_eval
"instance_eval"
end
def self.self_say_instance_eval
"self class eval"
end
end
puts 'me.singleton_class.instance_eval'.yellow
run(me, :say_instance_eval)
run(me, :self_say_instance_eval)
run(me, :dynamic_defined)
me = MyClass.new
me.singleton_class.class_eval do
define_method(:dynamic_defined) do
"define_method class_eval"
end
def say_class_eval
"class_eval"
end
def self.say_class_eval
"self class eval"
end
end
puts 'me.singleton_class.class_eval'.yellow
run(me, :say_class_eval)
run(me, :self_say_class_eval)
run(me, :dynamic_defined)
#class
MyClass.singleton_class.instance_eval do
define_method(:dynamic_defined) do
"define_method instance_eval"
end
def say_instance_eval
"instance_eval"
end
def self.say_instance_eval
"self instance eval"
end
end
puts 'MyClass.singleton_class.instance_eval'.yellow
run(MyClass, :say_instance_eval)
run(MyClass, :self_say_instance_eval)
run(MyClass, :dynamic_defined)
MyClass.singleton_class.class_eval do
define_method(:dynamic_defined) do
"define_method class_eval"
end
def say_class_eval
"class_eval"
end
def self.say_instance_eval
"self class eval"
end
end
puts 'MyClass.singleton_class.class_eval'.yellow
run(MyClass, :say_class_eval)
run(MyClass, :self_say_class_eval)
run(MyClass, :dynamic_defined)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment