Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save chrisroos/2fb0d521efcf089678b293275ddd52e2 to your computer and use it in GitHub Desktop.
Save chrisroos/2fb0d521efcf089678b293275ddd52e2 to your computer and use it in GitHub Desktop.

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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment