2

请参见以下示例:

puts __FILE__                           #test.rb
puts File.expand_path(__FILE__)         #C:/TEMP/test.rb

Dir.chdir('..')
puts __FILE__                           #test.rb
puts File.expand_path(__FILE__)         #C:/test.rb

在(全局)之后chdir返回expand_path错误的结果。

我怎样才能得到正确的结果?

我尝试使用的第二个参数File.expand_path

puts File.expand_path(__FILE__, 'temp') #C:/TEMP/test.rb
puts File.expand_path(__FILE__, 'c:/temp') #C:/TEMP/test.rb

但要使用它,我必须知道它的路径__FILE__

该命令require_relative似乎忽略了所有chdir动作。所以我有希望,有一种方法可以获取文件的“真实”目录。

评论:

  • 我知道Dir.chdir 的块版本- 对于我的特定任务,我不能使用它。
  • 我的实际解决方案:我在更改目录之前存储完整路径(我也可以Dir.pwd在更改目录之前存储)。
4

1 回答 1

3

__FILE__builtin 是String类的一个实例:

puts __FILE__.class 
# ⇒ String

这意味着你不应该期望它有任何巫术魔法。它存储相对路径,这个文件是在哪里加载的。

ruby C:\TEMP\test.rb        # ⇒ __FILE__ == 'C:\TEMP\test.rb'
cd C:\TEMP && ruby test.rb  # ⇒ __FILE__ == 'test.rb'

在 ruby​​ 2.0 中__dir__ 引入了新的内置函数。它看起来像您正在寻找的东西,以防万一您可以接受2.0唯一的解决方案。

于 2013-12-17T09:21:06.677 回答