Logan Capaldo
8/25/2007 3:12:00 PM
On 8/25/07, Trans <transfire@gmail.com> wrote:
> Is there a way to do the "opposite" of binding a superclass method to
> the current context? In other words, I want to call a method as if the
> current binding were an instance of the superclass. For example, using
> the method #public_methods as a basis of demonstration (could be any
> method though):
>
> class X
> def a; "a"; end
> end
>
> class Y < X
> def b; "b"; end
>
> def public_methods(all=true)
> # ?
>
> self.class.superclass.instance_method(:public_methods).bind(self).call(all)
> end
> end
>
> y = Y.new
>
> p y.public_methods(false)
>
> Of course, that produces
>
> ['b', 'public_methods']
>
> But what I want is:
>
> ['a']
>
> I suspect there's no way to do this short of resorting to delegation
> rather than subclassing. But I wanted to ask and make sure.
>
Well, I don't know about in general, but for this particular instance
(and similar ones) you could just do
class X
def a; "a"; end
end
class Y < X
def b; "b"; end
def public_methods(all = true)
self.class.superclass.public_instance_methods(all)
end
end
Incidently, you do realize that the whole mess of
self.class.superclass.instance_method(:public_methods).call(all) is
exactly equivalent to super right? At least in the context of
overriding public_methods anyway. And of course def foo(); super; end
is the same as not writing foo at all, so it's not surprising you get
the same result.
> Thanks,
> T.
>
>
>