Last active
August 29, 2015 14:19
-
-
Save NullVoxPopuli/9f89ef70cd2b509cc22c to your computer and use it in GitHub Desktop.
Testing how class_eval and instance_eval affect instances and classes
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# 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