From: Yutaka HARA <redmine@...>
Date: 2009-08-19T23:57:07+09:00
Subject: [ruby-core:24982] [Feature #1961] Kernel#__dir__

Feature #1961: Kernel#__dir__
http://redmine.ruby-lang.org/issues/show/1961

Author: Yutaka HARA
Status: Open, Priority: Normal

= Proposal

  Kernel#__dir__
  returns the value of File.dirname(__FILE__)

According to the google code search, about 60% of uses of __FILE__
are of the form File.dirname(__FILE__). Ruby 1.9.2 provides 
require_relative for this problem; but File.dirname(__FILE__) is 
not always used for requiring ruby scripts, but also for reading
data files. __dir__ helps these cases.

(Note: my proposal does not include __dir_dir__ this time :-)
It should be discussed in another threads)
Related ticket: http://redmine.ruby-lang.org/issues/show/642 

= Problem

File.dirname(__FILE__) is frequently used and too long.

= Analysis

There are 222 uses of __FILE__ listed by the google code search,
classified into these categories:

 (A) 30.6% (68) are used with require and File.dirname.
In Ruby 1.9.2, this case is supported by require_relative.

 (B) 31.1% (69) are with File.dirname, but not with require.
For example, reading data files of unit tests.

 (C) 21.6% (48) are the idiom, $0 == __FILE__. 

B is as many as A (and even more than C), so it is reasonable to
add a shortcut for File.dirname(__FILE__) in addition to require_relative.

* code: http://gist.github.com/170336
* result: http://route477.net/files/__file__.html

= Solutions

(1) add a toplevel constant __DIR__
pros: looks like __FILE__
cons: adding new keyword

(2) add Kernel#__DIR__
pros: no new keyword
cons: it should have a lower-case name (like 1.9's __method__),
because it is not a constant but a method.

(3) add Kernel#__dir__
pros: no new keyword, and it is clearer than (4) that it has
some associations with __FILE__.

(4) make __FILE__ to the default argument of File.dirname
pros: no new keyword nor new method
cons: it is not clear that 'File.dirname' is expanded to
the path of directory of __FILE__.

= Conclusion

I think (3) (Kernel#__dir__) is the best.

Thanks,
-- 
yhara (Yutaka HARA)
http://route477.net/


----------------------------------------
http://redmine.ruby-lang.org