Ruby 中的 __FILE__ 是什么意思?

发布于 2024-07-06 22:29:57 字数 153 浏览 8 评论 0原文

我在 Ruby 中经常看到这样的情况:

require File.dirname(__FILE__) + "/../../config/environment"  

__FILE__ 是什么意思?

I see this all the time in Ruby:

require File.dirname(__FILE__) + "/../../config/environment"  

What does __FILE__ mean?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

长途伴 2024-07-13 22:29:57

它是对当前文件名的引用。 在文件 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

It is a reference to the current file name. In the file foo.rb, __FILE__ would be interpreted as "foo.rb".

Edit: Ruby 1.9.2 and 1.9.3 appear to behave a little differently from what Luke Bayes said in his comment. With these files:

# test.rb
puts __FILE__
require './dir2/test.rb'
# dir2/test.rb
puts __FILE__

Running ruby test.rb will output

test.rb
/full/path/to/dir2/test.rb
遇到 2024-07-13 22:29:57

__FILE__ 的值是加载文件时创建和存储(但从未更新)的相对路径。 这意味着,如果您在应用程序的其他任何地方调用 Dir.chdir,则该路径将错误扩展。

puts __FILE__
Dir.chdir '../../'
puts __FILE__

解决此问题的一种方法是在任何应用程序代码之外存储 __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

The value of __FILE__ is a relative path that is created and stored (but never updated) when your file is loaded. This means that if you have any calls to Dir.chdir anywhere else in your application, this path will expand incorrectly.

puts __FILE__
Dir.chdir '../../'
puts __FILE__

One workaround to this problem is to store the expanded value of __FILE__ outside of any application code. As long as your require statements are at the top of your definitions (or at least before any calls to Dir.chdir), this value will continue to be useful after changing directories.

$MY_FILE_PATH = File.expand_path(File.dirname(__FILE__))

# open class and do some stuff that changes directory

puts $MY_FILE_PATH
独孤求败 2024-07-13 22:29:57

__FILE__ 是包含正在执行的代码的文件扩展名的文件名。

foo.rb 中,__FILE__ 将是“foo.rb”。

如果 foo.rb 位于目录 /home/josh 中,则 File.dirname(__FILE__) 将返回 /home/josh< /代码>。

__FILE__ is the filename with extension of the file containing the code being executed.

In foo.rb, __FILE__ would be "foo.rb".

If foo.rb were in the dir /home/josh then File.dirname(__FILE__) would return /home/josh.

红衣飘飘貌似仙 2024-07-13 22:29:57

在 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)兼容,您应该使用我上面展示的构造来请求文件。

In Ruby, the Windows version anyways, I just checked and __FILE__ does not contain the full path to the file. Instead it contains the path to the file relative to where it's being executed from.

In PHP __FILE__ is the full path (which in my opinion is preferable). This is why, in order to make your paths portable in Ruby, you really need to use this:

File.expand_path(File.dirname(__FILE__) + "relative/path/to/file")

I should note that in Ruby 1.9.1 __FILE__ contains the full path to the file, the above description was for when I used Ruby 1.8.7.

In order to be compatible with both Ruby 1.8.7 and 1.9.1 (not sure about 1.9) you should require files by using the construct I showed above.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文