gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 06:53:50 24 4
gpt4 key购买 nike

我有一个 gem,里面有这样的代码:

def read(file)
@file = File.new file, "r"
end

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

app/main.rb
app/templates/example.txt

main.rb有如下代码:

require 'mygem'

example = MyGem.read('templates/example.txt')

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

require 'mygem'

example = MyGem.read('templates/example.txt', File.dirname(__FILE__))

这很好用,但我觉得它有点难看。有没有办法让类知道正在调用什么文件 read() 并根据它计算出路径?

最佳答案

有一个有趣的图书馆 - i told you it was private .人们可以用它来保护他们的方法不被外部调用。该代码找到调用方方法的文件并将其删除。 罪犯是使用这条线找到的:

offender = caller[0].split(':')[0]

我猜你可以在你的 MyGem.read 代码中使用它:

def read( file )
fpath = Pathname.new(file)
if fpath.relative?
offender = caller[0].split(':')[0]
fpath = File.join( File.dirname( offender ), file )
end
@file = File.new( fpath, "r" )
end

这样您就可以使用相对于您的 Mygem 调用者而不是 pwd 的路径。正是您在 app/main.rb

中尝试的方式

关于ruby - 获取实例化类 ruby​​ 的文件目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14772381/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com