Logan Capaldo
2/6/2006 9:25:00 PM
On Feb 6, 2006, at 4:06 PM, ara.t.howard@noaa.gov wrote:
>
> this suprised me today:
>
> harp:~ > cat a.rb
> class A
> def assertion
> raise NotImplementedError
> end
> alias_method "assertion?", "assertion"
> end
>
> class B < A
> def assertion
> true
> end
> end
>
> B::new.assertion?
>
>
> harp:~ > ruby a.rb
> a.rb:3:in `assertion?': NotImplementedError (NotImplementedError)
> from a.rb:14
>
>
> this only way i can seem to make this work is through some
> self::inherited
> hacks or to actually define assertion? in the base class. is there
> no clean
> way to inherit aliases?
>
> regards.
>
> -a
>
> --
> happiness is not something ready-made. it comes from your own
> actions.
> - h.h. the 14th dali lama
>
This makes sense, If you consider the common idiom of alias'ing a
method to wrap additional functionality around it. If alias(_method)
didn't work like that you couldn't use it like this. alias_method
doesn't work like assignment in ruby, its more like it creates a new
method with the same source as the original method.
As a poorly conceived alternative:
% cat a.rb
class Class
def shallow_alias(new_name, current_name)
self.module_eval <<-END
def #{new_name}(*args, &block)
#{current_name}(*args, &block)
end
END
end
end
class A
def assertion
raise NotImplementedError
end
shallow_alias "assertion?", "assertion"
end
class B < A
def assertion
true
end
end
B.new.assertion?
% ruby a.rb
%