获取实例化类ruby的文件目录

and*_*ndy 8 ruby file-io

我有一个内部有这样代码的宝石:

def read(file)
    @file = File.new file, "r"
end
Run Code Online (Sandbox Code Playgroud)

现在的问题是,你有一个像这样的目录结构:

app/main.rb
app/templates/example.txt
Run Code Online (Sandbox Code Playgroud)

main.rb具有以下代码:

require 'mygem'

example = MyGem.read('templates/example.txt')
Run Code Online (Sandbox Code Playgroud)

它提出来了File Not Found: templates/example.txt.它可以工作,如果example.txt它在同一目录中,main.rb但不是如果它在一个目录中.为了解决这个问题,我添加了一个名为relative_toin 的可选参数read().这需要一个绝对路径,所以上面可能需要:

require 'mygem'

example = MyGem.read('templates/example.txt', File.dirname(__FILE__))
Run Code Online (Sandbox Code Playgroud)

这很好,但我觉得它有点难看.反正有没有这样做,所以类知道read()调用什么文件并根据它来计算路径?

Ale*_*kin 1

您也可以检查来电者

def read(file)
  if /^(?<file>.+?):.*?/ =~ caller(1).first
    caller_dir, caller_file = Pathname.new(Regexp.last_match[:file]).split
    file_with_path = File.join caller_dir, file
    @file = File.new "#{file_with_path}", "r"
  end
end
Run Code Online (Sandbox Code Playgroud)

我不建议您这样做(上面的代码将中断间接调用,因为caller(1),请参阅 上的文档参考caller)。此外,如果调用者路径打算包含冒号,则应更准确地调整上面的正则表达式。