Modular classes and avoiding extension clashes

T

Trans

I refer back to:

Ruby-talk: 240334


http://groups.google.com/group/ruby...ss+module+trans&rnum=2&hl=en#409301042321f6fc

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.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,733
Messages
2,569,439
Members
44,829
Latest member
PIXThurman

Latest Threads

Top