ChatGPT解决这个技术问题 Extra ChatGPT

__FILE__ 在 Ruby 中是什么意思?

我一直在 Ruby 中看到这一点:

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

__FILE__ 是什么意思?

要帮助将参考文献联系在一起,另请参阅 ruby-forum.com/topic/143383stackoverflow.com/questions/4325759/…

C
Community

它是对当前文件名的引用。在文件 foo.rb 中,__FILE__ 将被解释为 "foo.rb"

编辑: Ruby 1.9.2 和 1.9.3 的行为似乎与 Luke Bayes 在 his comment 中所说的略有不同。使用这些文件:

# 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.expand_path(FILE) 来获取绝对路径
双下划线在上面的评论中被自动删除。
这在 ruby 1.9.2 中仍然成立吗?
@Zasz 它在 1.9.2 中的工作方式有点不同。最初加载的文件具有相对的 __FILE__,但其他包含/必需的文件具有绝对路径。
@LukeBayes您可以通过用反引号包围文字文本来保留Stack Overflow评论中的下划线和其他特殊字符。写 `__FILE__` 得到 __FILE__
c
cutalion

__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

This means that if you have any calls to Dir.chdir anywhere else in your application, this path will expand incorrectly. 在我的测试下,路径扩展正确。我的 ruby 版本是 2.3.7,也许更新的 ruby 版本解决了这个问题。
E
Ethan

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

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

如果 foo.rb 在目录 /home/josh 中,则 File.dirname(__FILE__) 将返回 /home/josh


正是在寻找这个。 +1 :=) @Ethan
文档链接 here
t
the Tin Man

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


您需要在相对路径前添加一个斜杠:File.expand_path(File.dirname(__FILE__) + "/relative/path/to/file")
您永远不应该对目录分隔符进行硬编码。改用 File.join:File.expand_path( File.join( File.dirname(__FILE__), "relative", "path", "to", "file") )
安德鲁,你能帮帮我吗?我正在使用以下内容写入文件: path = YAML::load_file(File.open(File.join(File.dirname(FILE) + "/massa/users.yml"))) path[:cad_user][: user] = input_email_create.value File.open(File.join(File.dirname(FILE) + '/massa/users.yml'), 'w') {|f| f.write path.to_yaml } 但我收到消息:没有这样的文件或目录@rb_sysopen