回答:
現在のファイル名への参照です。ファイルfoo.rb
で__FILE__
は、と解釈され"foo.rb"
ます。
編集: Ruby 1.9.2および1.9.3の動作は、Luke Bayesのコメントで述べたものとは少し異なります。これらのファイルで:
# test.rb
puts __FILE__
require './dir2/test.rb'
# dir2/test.rb
puts __FILE__
実行ruby test.rb
すると出力されます
test.rb
/full/path/to/dir2/test.rb
`__FILE__`
取得するために書く__FILE__
。
の値__FILE__
は、ファイルのロード時に作成および保存される(ただし、更新されない)相対パスです。つまりDir.chdir
、アプリケーションの他の場所への呼び出しがある場合、このパスは正しく展開されません。
puts __FILE__
Dir.chdir '../../'
puts __FILE__
この問題の回避策の1つ__FILE__
は、アプリケーションコードの外側に展開された値を格納することです。require
ステートメントが定義の先頭にある限り(または少なくとも呼び出しの前に)Dir.chdir
)、この値はディレクトリを変更した後も引き続き役立ちます。
$MY_FILE_PATH = File.expand_path(File.dirname(__FILE__))
# open class and do some stuff that changes directory
puts $MY_FILE_PATH
This means that if you have any calls to Dir.chdir anywhere else in your application, this path will expand incorrectly.
パスは私のテストで正しく拡張されました。私のルビーのバージョンは2.3.7ですが、新しいルビーのバージョンでこの問題が修正されたのでしょう。
__FILE__
実行されるコードを含むファイルの拡張子付きのファイル名です。
ではfoo.rb
、__FILE__
「foo.rb」になります。
場合はfoo.rb
、DIRにあった/home/josh
後、File.dirname(__FILE__)
戻ってきます/home/josh
。
RubyのWindowsバージョンはとにかくチェックしただけで__FILE__
、ファイルへのフルパスが含まれていません。代わりに、ファイルの実行元からの相対パスが含まれます。
PHPでは__FILE__
フルパスです(私の意見ではこれが望ましいです)。これが、Rubyでパスを移植可能にするために、実際にこれを使用する必要がある理由です。
File.expand_path(File.dirname(__FILE__) + "relative/path/to/file")
Ruby 1.9.1 __FILE__
にはファイルへのフルパスが含まれていることに注意してください。上記の説明はRuby 1.8.7を使用した場合のものです。
Ruby 1.8.7と1.9.1の両方(1.9については不明)と互換性を持たせるには、上記で示した構成を使用してファイルを要求する必要があります。
File.expand_path(File.dirname(__FILE__) + "/relative/path/to/file")
File.expand_path( File.join( File.dirname(__FILE__), "relative", "path", "to", "file") )