Project

General

Profile

Feature #1961

Updated by matz (Yukihiro Matsumoto) over 11 years ago

=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 
 

Back