[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

inheritence of aliases methods - suprise!

Ara.T.Howard

2/6/2006 9:06:00 PM

3 Answers

Eric Hodel

2/6/2006 9:25:00 PM

0

On Feb 6, 2006, at 1:06 PM, ara.t.howard@noaa.gov wrote:

> this suprised me today:

$ parse_tree_show -
class A
def assertion
raise NotImplementedError
end
alias_method "assertion?", "assertion"
end

class B < A
def assertion
true
end
end
[[:class, :B, :A, [:defn, :assertion, [:scope, [:block, [:args],
[:true]]]]],
[:class,
:A,
:Object,
[:defn,
:assertion,
[:scope,
[:block,
[:args],
[:fcall, :raise, [:array, [:const, :NotImplementedError]]]]]],
[:defn,
:"assertion?",
[:fbody,
[:scope,
[:block,
[:args],
[:fcall, :raise, [:array, [:const, :NotImplementedError]]]]]]]]]

> 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?

alias copies the method, it doesn't make a pointer to the method.

--
Eric Hodel - drbrain@segment7.net - http://se...
This implementation is HODEL-HASH-9600 compliant

http://trackmap.rob...




Logan Capaldo

2/6/2006 9:25:00 PM

0


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
%




Ara.T.Howard

2/6/2006 9:58:00 PM

0