web-dev-qa-db-ja.com

__FILE__が大文字で__dir__が小文字であるのはなぜですか?

Ruby 2.0.0-p0では、__dir__変数は、現在実行中のファイルのディレクトリに簡単にアクセスできるように導入されました。

なぜ__dir__小文字の場合__FILE__は大文字ですか?

60

___FILE___は解析時間定数であるのに対し、___dir___は関数であり、File.dirname(File.realpath(__FILE__))を返すためです

詳細については、 このディスカッション を参照してください。

58
Intrepidd

TL; DR

言語実装の選択の相対的なメリットは、合理的なスタックオーバーフローの質問の範囲外です。ただし、これは言語の混乱を招く可能性のあるユースケースを特定し、2つの言語要素の違いを明確にしようとするため、これは良い質問です。

キーワード、メソッド、およびメソッドのように見えるキーワード

__FILE__はキーワードです

Ruby 1.9、__FILE__はキーワードです。 Objectクラスで定義されたメソッドのように見えますが、 Object #__ FILE __ のソースは次のように述べています。

# File keywords.rb, line 68
def __FILE__
end

2.0.0-p0でのソースのクイックスキャンでは、keywords.rbファイルは表示されませんでしたが、__FILE__は構文的にキーワードのままです。おそらく他の誰かがあなたに現在の定義の場所を教えてくれるでしょう。

__dir__はメソッドです

Kernel #__ dir __ は実際にはメソッドです。カーネルの定義済みメソッドをgrepすることで、これを自分で確認できます。

Kernel.methods.grep /__dir__/
# => [:__dir__]

バグとディスカッション

事実 __FILE__はキーワードであり、(一種の)メソッドは バグで呼び出されたバグ関連のコメント です。 Ruby-Core Forum では、命名規則のさまざまな長所と短所についても議論されました。

答えはちょっと物足りないかもしれませんが、それが現状です。それがあなたが強く感じる言語設計の問題である場合、Rubyコアチームに参加することはそれに対処する適切な方法でしょう。

31
Todd A. Jacobs