Project

General

Profile

Actions

Feature #2117

closed

Binding to a class, a method from the class's superclass's metaclass, fails

Added by duairc (Shane O'Brien) over 15 years ago. Updated about 14 years ago.

Status:
Closed
Target version:
-
[ruby-core:25632]

Description

=begin
I guess the best way to explain this is with an example:

class A; def self.foo; 'bar'; end; end
=> nil
class B < A; end
=> nil
A.method(:foo).unbind.bind(B)
TypeError: singleton method called for a different object
from (irb):3:in bind' from (irb):3 from /usr/bin/irb1.9:12:in '

I've tried this on Ruby 1.8.5, 1.8.6, 1.8.7, 1.9.0 and 1.9.1 and I get this behaviour. It works in JRuby however. It's quite trivial to fix. I've attached a patch below, after the application of which Ruby's behaviour is:

class A; def self.foo; 'bar'; end; end
=> nil
class B < A; end
=> nil
A.method(:foo).unbind.bind(B).call
=> "bar"
a = A.new
=> #<A:0x00000000b1d870>
b = B.new
=> #<B:0x00000000b18230>
a.define_singleton_method(:foo){'baz'}
=> #<Proc:0x00000000b10df0@(irb):6 (lambda)>
a.method(:foo).unbind.bind(b)
TypeError: singleton method called for a different object
from (irb):7:in bind' from (irb):7 from ./irb:12:in '

I think this makes more sense.
=end


Files

fix-class-meta-class-superclass-bind.patch (1.63 KB) fix-class-meta-class-superclass-bind.patch duairc (Shane O'Brien), 09/18/2009 07:57 PM
Actions #1

Updated by marcandre (Marc-Andre Lafortune) over 15 years ago

  • Category set to core
  • Assignee set to marcandre (Marc-Andre Lafortune)

=begin

=end

Actions #3

Updated by nobu (Nobuyoshi Nakada) over 15 years ago

  • Status changed from Closed to Assigned
  • Assignee changed from marcandre (Marc-Andre Lafortune) to matz (Yukihiro Matsumoto)

=begin

=end

Actions #4

Updated by nobu (Nobuyoshi Nakada) over 15 years ago

=begin
Hi,

At Wed, 23 Sep 2009 06:04:42 +0900,
Marc-Andre Lafortune wrote in [ruby-core:25719]:

Thank you for your patch.
Applied in http://redmine.ruby-lang.org/repositories/revision/ruby-19?rev=25046

Also fixed 1.8
http://redmine.ruby-lang.org/repositories/revision/ruby-19?rev=25047

Rubyspecs updated.

I've thought it was intentional behavior and the patch changes
the spec, though I don't object against the change.

--
Nobu Nakada

=end

Actions #5

Updated by marcandre (Marc-Andre Lafortune) over 15 years ago

=begin
Hi!
Yes, I hesitated before making the change but my reasoning was:

  • past behavior contradicted the doc & intuition (at least mine! ;-)
  • no apparent valid reason for past behavior (either for MRI or the language)
  • possibly previous behavior was in thinking of singleton classes of objects, maybe because Ruby 1.8's official inheritance for singleton classes is just wrong (see #567 )
  • fixing the bug wouldn't cause any compatibility issue; I could not see how one would rely on the #bind or #define_method failing, and if it didn't that it would be a problem.

I'll undo the changes if this is incorrect though.
=end

Actions #6

Updated by mame (Yusuke Endoh) about 15 years ago

  • Status changed from Assigned to Closed

=begin
Hi,

2009/9/24 Marc-Andre Lafortune :

Hi!
? Yes, I hesitated before making the change but my reasoning was:

  • past behavior contradicted the doc & intuition (at least mine! ;-)
  • no apparent valid reason for past behavior (either for MRI or the language)
  • possibly previous behavior was in thinking of singleton classes of objects, maybe because Ruby 1.8's official inheritance for singleton classes is just wrong (see #567 )
  • fixing the bug wouldn't cause any compatibility issue; I could not see how one would rely on the #bind or #define_method failing, and if it didn't that it would be a problem.

I'll undo the changes if this is incorrect though.

Any objection has not been expressed. And I personally agree
with Marc-Andre.

So I close this ticket. If anyone has an objection, please
reopen the ticket by the end of this month.

--
Yusuke ENDOH
=end

Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0Like0