Forum: Ruby-core [Closed] Kernel#__dir__

Posted by matz (Yukihiro Matsumoto) (Guest)
on 2012-08-03 13:08
(Received via mailing list)
Issue #1961 has been updated by matz (Yukihiro Matsumoto).

Description updated
Status changed from Assigned to Closed


----------------------------------------
Feature #1961: Kernel#__dir__
https://bugs.ruby-lang.org/issues/1961#change-28625

Author: yhara (Yutaka HARA)
Status: Closed
Priority: Normal
Assignee: matz (Yukihiro Matsumoto)
Category: core
Target version: 2.0.0


=begin
 = 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/
=end
Please log in before posting. Registration is free and takes only a minute.
Existing account (Switch to SSL-encrypted connection)
NEW: Do you have a Google/GoogleMail or Yahoo account? No registration required!
Log in with Google account | Log in with Yahoo account
No account? Register here.