This follows on from https://gist.github.com/chrisroos/fc62b8e0ce30288abba6a3762b2cb1ee.
# The output below is from using Ruby 1.8.7
# The "singleton method bound for a different object" errors don't occur in Ruby 1.9.3 or above
class Foo
def self.my_class_method
"#{self}.class-method"
end
def my_instance_method
"#{self}#instance-method"
end
end
# Bound methods
Bound_class_method = Foo.method(:my_class_method)
Bound_instance_method = Foo.new.method(:my_instance_method)
p Bound_class_method.call
p Bound_instance_method.call
# Unbound methods
Unbound_class_method = (class << Foo; instance_method(:my_class_method); end)
Unbound_instance_method = Foo.instance_method(:my_instance_method)
p Unbound_class_method.bind(Foo).call
p Unbound_instance_method.bind(Foo.new).call
class Foo
class << self
define_method(:my_class_method_from_bound_1, Bound_class_method)
define_method(:my_class_method_from_unbound_1, Unbound_class_method)
define_method(:my_class_method_from_bound_2) { Bound_class_method.call }
define_method(:my_class_method_from_unbound_2) { Unbound_class_method.bind(self).call }
end
define_method(:my_instance_method_from_bound, Bound_instance_method)
define_method(:my_instance_method_from_unbound, Unbound_instance_method)
end
p Foo.my_class_method_from_bound_1
p Foo.my_class_method_from_unbound_1
p Foo.my_class_method_from_bound_2
p Foo.my_class_method_from_unbound_2
p Foo.new.my_instance_method_from_bound
p Foo.new.my_instance_method_from_unbound
class Bar < Foo
end
p Bar.my_class_method
# p Bar.my_class_method_from_bound_1 #=> singleton method bound for a different object
# p Bar.my_class_method_from_unbound_1 #=> singleton method bound for a different object
p Bar.my_class_method_from_bound_2
# p Bar.my_class_method_from_unbound_2 #=> singleton method bound for a different object
p Bar.new.my_instance_method
p Bar.new.my_instance_method_from_bound
p Bar.new.my_instance_method_from_unbound