Global methods in Ruby standard lib

  • Thread starter Alexander E. Fischer
  • Start date
A

Alexander E. Fischer

I noticed that at least some of the standard libs use global methods to
provide some kind of shortcut to the actual new method. For example the
excellent Pathname class' objects can be generated either by

Pathname.new('/home/someone')

or simply through

Pathname('/home/someone')

The latter example is possible through a method on the Kernel module,
which is named capitalized.

module Kernel
def Pathname(path)
Pathname.new(path)
end
end

I think this shortcut is really useful, but also very ugly in its
implementation. If more classes do this, especially classes outside of
the class library, the global method namespace, which is already filled
with a lot of things, will become overcrowded. In the end there will be
naming collisions because of a lack of sub-namespacing. To discourage
this behaviour I would recommend to remove those global methods and
implement the whole thing in a slightly different fashion:

class Pathname
def self.[](path)
new(path)
end
end

This implementation would allow this:

Pathname['/home/someone']

which is still very near to the current variant but more eco-friendly in
my opinion.

If there is no big problem about this (tell me, if you see one!) I'm
willing to add the new methods in affected classes (at least the standard
lib classes Complex and Rational use this, too) and add a deprecation
warning in the old methods. Then I would submit this as a patch.
 
A

Alexander E. Fischer

I noticed that at least some of the standard libs use global methods to
provide some kind of shortcut to the actual new method. For example the
excellent Pathname class' objects can be generated either by

Pathname.new('/home/someone')

or simply through

Pathname('/home/someone')

The latter example is possible through a method on the Kernel module,
which is named capitalized.

module Kernel
def Pathname(path)
Pathname.new(path)
end
end

I think this shortcut is really useful, but also very ugly in its
implementation. If more classes do this, especially classes outside of
the class library, the global method namespace, which is already filled
with a lot of things, will become overcrowded. In the end there will be
naming collisions because of a lack of sub-namespacing. To discourage
this behaviour I would recommend to remove those global methods and
implement the whole thing in a slightly different fashion:

class Pathname
def self.[](path)
new(path)
end
end

This implementation would allow this:

Pathname['/home/someone']

which is still very near to the current variant but more eco-friendly in
my opinion.

If there is no big problem about this (tell me, if you see one!) I'm
willing to add the new methods in affected classes (at least the
standard lib classes Complex and Rational use this, too) and add a
deprecation warning in the old methods. Then I would submit this as a
patch.

Sorry for the repost. Do NOT use this thread to discuss. Use the other
thread called "Global method usage in standard libs" for your answers.

Thank you.
 

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

No members online now.

Forum statistics

Threads
473,995
Messages
2,570,236
Members
46,825
Latest member
VernonQuy6

Latest Threads

Top