Forum: Ruby Modular classes and avoiding extension clashes

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.
Trans (Guest)
on 2007-06-22 00:18
(Received via mailing list)
I refer back to:

  Ruby-talk: 240334


http://groups.google.com/group/ruby-talk-google/br...

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.
juan pedro meriño (Guest)
on 2007-06-22 00:23
(Received via mailing list)
I have ruby in my linux, but i don't know how do start to ruby for web,
please how i make it?

2007/6/21, Trans <removed_email_address@domain.invalid>:
This topic is locked and can not be replied to.