Forum: Ruby alias_method 'stickiness'

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Ara.T.Howard (Guest)
on 2006-03-13 02:48
(Received via mailing list)
any idea if this behaviour is intended or not?


   mussel:~/eg/ruby/nrtlib/nrtlib-0.0.0 > cat a.rb
   #
   # the problem
   #
     module NRT
       class Subscription
         def process_incoming
           raise NotImplementedError
         end
         alias_method "run", "process_incoming"
       end
       class OLSSubscription < Subscription
         def process_incoming
           p 42
         end
       end
     end
     begin; NRT::OLSSubscription::new.run ;rescue Exception => e; p e;
end

   #
   # an easy solution
   #
     module NRT
       class Subscription
         def self::anonym dst, src
           module_eval %Q[ def #{ dst }(*a, &b) #{ src }(*a, &b) end ]
         end
         anonym "run", "process_incoming"
       end
     end
     NRT::OLSSubscription::new.run



   mussel:~/eg/ruby/nrtlib/nrtlib-0.0.0 > ruby a.rb
   #<NotImplementedError: NotImplementedError>
   42


this seems odd to me.

-a
Joel VanderWerf (Guest)
on 2006-03-13 04:31
(Received via mailing list)
Ara.T.Howard wrote:
>         def process_incoming
>           raise NotImplementedError
>         end
>         alias_method "run", "process_incoming"

Unfortunately (?) what this^^^ does is define run to be a copy of the
method process_incoming, rather than define run as a method that
delegates to process_incoming.

I suppose this behavior is necessary if you want to use alias_method to
wrap an old method, regardless of what gets redefined in child classes.
unknown (Guest)
on 2006-03-13 04:55
(Received via mailing list)
On Mon, 13 Mar 2006, Joel VanderWerf wrote:

>>       class Subscription
> wrap an old method, regardless of what gets redefined in child classes.
doh!  yup - yer right.  i like my 'anonym' method more and more.
perhaps an
option to alias_method like

   alias_method "foo", "bar", :dup => false

or, more concise

   alias_method "foo", "bar", false

though i detest dangling bool arguments (method(true, false, true, true,
false) acckkkk!)...

either that or alias_method should be renamed copy_method ;-)

thoughts?

-a
Joel VanderWerf (Guest)
on 2006-03-13 22:01
(Received via mailing list)
removed_email_address@domain.invalid wrote:
>>>   #
>>
>
>   alias_method "foo", "bar", false
>
> though i detest dangling bool arguments (method(true, false, true, true,
> false) acckkkk!)...
>
> either that or alias_method should be renamed copy_method ;-)

I've just gotten used to using alias *only* for metaprogramming, and not
for ordinary API definition.

Maybe it would be nice if the alias keyword were reserved for the
delegation style definition, like your anonym method, and the
metaprogramming interface were something like this:

class Foo
  # alias :m_copy :m # old way
  instance_method_at[:m_copy] = instance_method(:m) # new way
  # now you can wrap :m_copy however you want
end

This makes it more clear that you are making a copy, so it might be less
confusing.
unknown (Guest)
on 2006-03-13 22:54
(Received via mailing list)
On Tue, 14 Mar 2006, Joel VanderWerf wrote:

>  # now you can wrap :m_copy however you want
> end
>
> This makes it more clear that you are making a copy, so it might be less
> confusing.

i like that.  what do you think about

   class Foo
     delegate :src, :dst
   end

??

-a
This topic is locked and can not be replied to.