我在Ruby中经常看到这样的情况:
require File.dirname(__FILE__) + "/../../config/environment"
__FILE__是什么意思?
__FILE__
nue99wik1#
它是对当前文件名的引用。在文件foo.rb中,__FILE__将被解释为"foo.rb"。
foo.rb
"foo.rb"
**编辑:**Ruby 1.9.2和1.9.3的表现似乎与Luke Bayes在他的评论中所说的有些不同。
第一个运行ruby test.rb将输出
ruby test.rb
test.rb /full/path/to/dir2/test.rb
mhd8tkvw2#
__FILE__的值是一个相对路径,它是在加载文件时创建和存储的(但从不更新)。这意味着如果在应用程序中的任何其他位置调用Dir.chdir,则此路径将错误地展开。
Dir.chdir
puts __FILE__ Dir.chdir '../../' puts __FILE__
解决这个问题的一个方法是将__FILE__的扩展值存储在任何应用程序代码之外。只要您的require语句位于定义的顶部(或者至少在任何Dir.chdir调用之前),该值在更改目录后仍将继续有用。
require
$MY_FILE_PATH = File.expand_path(File.dirname(__FILE__)) # open class and do some stuff that changes directory puts $MY_FILE_PATH
7y4bm7vi3#
__FILE__是包含正在执行的代码的文件的文件名及其扩展名。在foo.rb中,__FILE__将是“foo.rb”。如果foo.rb位于目录/home/josh中,则File.dirname(__FILE__)将返回/home/josh。
/home/josh
File.dirname(__FILE__)
ws51t4hk4#
在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)兼容,您应该使用上面显示的结构来要求文件。
4条答案
按热度按时间nue99wik1#
它是对当前文件名的引用。在文件
foo.rb
中,__FILE__
将被解释为"foo.rb"
。**编辑:**Ruby 1.9.2和1.9.3的表现似乎与Luke Bayes在他的评论中所说的有些不同。
第一个
运行
ruby test.rb
将输出mhd8tkvw2#
__FILE__
的值是一个相对路径,它是在加载文件时创建和存储的(但从不更新)。这意味着如果在应用程序中的任何其他位置调用Dir.chdir
,则此路径将错误地展开。解决这个问题的一个方法是将
__FILE__
的扩展值存储在任何应用程序代码之外。只要您的require
语句位于定义的顶部(或者至少在任何Dir.chdir
调用之前),该值在更改目录后仍将继续有用。7y4bm7vi3#
__FILE__
是包含正在执行的代码的文件的文件名及其扩展名。在
foo.rb
中,__FILE__
将是“foo.rb”。如果
foo.rb
位于目录/home/josh
中,则File.dirname(__FILE__)
将返回/home/josh
。ws51t4hk4#
在Ruby中,不管怎样,Windows版本,我只是检查了一下,
__FILE__
并不包含文件的完整路径,而是包含了文件相对于执行位置的路径。在PHP中,
__FILE__
是完整路径(在我看来,这是更可取的)。这就是为什么,为了使路径在Ruby中可移植,您真的需要使用以下代码:我应该注意到在Ruby 1.9.1中
__FILE__
包含了文件的完整路径,上面的描述是针对我使用Ruby 1.8.7时的情况。为了与Ruby 1.8.7和1.9.1(不确定1.9)兼容,您应该使用上面显示的结构来要求文件。