我有一个内部有这样代码的宝石:
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_to
in 的可选参数read()
.这需要一个绝对路径,所以上面可能需要:
require 'mygem'
example = MyGem.read('templates/example.txt', File.dirname(__FILE__))
Run Code Online (Sandbox Code Playgroud)
这很好,但我觉得它有点难看.反正有没有这样做,所以类知道read()
调用什么文件并根据它来计算路径?
您也可以检查来电者:
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
)。此外,如果调用者路径打算包含冒号,则应更准确地调整上面的正则表达式。