Asp Forum
Home
|
Login
|
Register
|
Search
Forums
>
comp.lang.ruby
Modular classes and avoiding extension clashes
Trans
6/21/2007 8:17:00 PM
I refer back to:
Ruby-talk: 240334
http://groups.google.com/group/ruby-talk-google/browse_thread/thread/9dbe8cd0898227b5/409301042321f6fc?lnk=gst&q=open+class+module+trans&rnum=2&hl=en#409301...
I've thought of another potential benefit of this approach. While I
had believed it would be only reasonable to have a single anonymous
module per class, there may be greater benefit in multiple modules. B/
c, it may make possible the avoidance of extension clashes. Here's an
example:
# friend1.rb
class String
def exclaim; self + '!'; end
def scream; exclaim + '!!'; end
end
...
# friend2.rb
class String
def exclaim; puts self + '!'; end
def scream; exclaim; exclaim; end
end
...
# elsewhere.rb
require 'firend1'
require 'firend2'
Clearly there's a conflict. How can I use friend1#scream but also
friend2#scream? One's first thought could well be to alias the method
so it's under a different name:
# elsewhere.rb
require 'firend1'
class String
alias :friend1scream, :scream
end
require 'friend2'
"hey".firend1scream
However, #exclaim is called by #scream so it will still not work as
expected.
So getting back to the original suggestion (of the previous thread),
having open extensions contained in hidden modules... what if method
lookup followed a route of first checking within the same module, then
continuing upward before dropping back to ancestors? In other words if
we had a class, C < M1 < M2 and a method was called on it that is
defined in M2, then any method the M2 method calls would first be
looked for in M2, then M1, before falling back to Object and Kernel.
This would resolve the problem with the above example.
It seems to me this is not necessarily unexpected behavior either. If
I create a method A that depends on a another method B, clearly
overriding B is dangerous business --it's something not generally
done. Usually it's the "top most" methods --the ones that depend on
others, that we override. That's not to say there aren't cases to do
so, but in that case a 'redef' keyword could be used explicitly.
T.
Servizio di avviso nuovi messaggi
Ricevi direttamente nella tua mail i nuovi messaggi per
Modular classes and avoiding extension clashes
Inserendo la tua e-mail nella casella sotto, riceverai un avviso tramite posta elettronica ogni volta che il motore di ricerca troverà un nuovo messaggio per te
Il servizio è completamente GRATUITO!
x
Login to ForumsZone
Login with Google
Login with E-Mail & Password