Rubyで__FILE__はどういう意味ですか?


回答:


144

現在のファイル名への参照です。ファイル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

87
この答えは正確ではありません。FILEは、現在の実行ディレクトリからの絶対パスではなく、ファイルへの「相対」パスです。絶対パスを取得するには、File.expand_path(FILE)を使用する必要があります
Luke Bayes

7
上記のコメント内で二重下線が自動的に削除されました。
ルークベイズ

1
これはruby 1.9.2でも当てはまりますか?
Zasz

4
@Zasz 1.9.2では動作が少し異なります。最初にロードされたファイルには相対__FILE__がありますが、他のインクルード/必須ファイルには絶対パスがあります。
ジェフ

9
@LukeBayesリテラルテキストをバッククォートで囲むことにより、スタックオーバーフローコメントでアンダースコアやその他の特殊文字を保持できます。`__FILE__`取得するために書く__FILE__
ロリーオケイン

62

の値__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ですが、新しいルビーのバージョンでこの問題が修正されたのでしょう。
Alec.Zhou

28

__FILE__ 実行されるコードを含むファイルの拡張子付きのファイル名です。

ではfoo.rb__FILE__「foo.rb」になります。

場合はfoo.rb、DIRにあった/home/josh後、File.dirname(__FILE__)戻ってきます/home/josh


まさにこれを探しています。+1:=)@Ethan
KM Rakibul Islam

1
ドキュメントへのリンクここに
ロスAttrill

17

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")
フェリックスラーベ

3
ディレクトリ区切り文字をハードコードしないでください。代わりに使用File.join: File.expand_path( File.join( File.dirname(__FILE__), "relative", "path", "to", "file") )
アンドリュー・ホジキンソン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.