我想像这样访问类的来源:
# Module inside file1.rb
module MetaFoo
class << Object
def bar
# here I'd like to access the source location of the Foo class definition
# which should result in /path/to/file2.rb
end
end
end
# Class inside another file2.rb
class Foo
bar
end
我可以做一些不好的事情:
self.send(:caller)
并尝试解析输出,甚至:
class Foo
bar __FILE__
end
但那不是,我想要,我希望有一个更优雅的解决方案。
欢迎任何提示。
答案 0 :(得分:2)
$0
和__FILE__
对您都有用。
$0
是正在运行的应用程序的路径。
__FILE__
是当前脚本的路径。
因此,__FILE__
将是脚本或模块,即使它是required
。
此外,__LINE__
可能对您有用。
有关详细信息,请参阅“What does __FILE__
mean in Ruby?”,“What does if __FILE__ == $0
mean in Ruby”和“What does class_eval <<-“end_eval”, __FILE__, __LINE__
mean in Ruby?。
答案 1 :(得分:1)
您可以尝试致电:
caller.first
这将打印文件名和行号。使用上面的演示文件(稍作修改:
file1.rb:
module MetaFoo
class << Object
def bar
puts caller.first # <== the magic...
end
end
end
file2.rb:
require './file1.rb'
class Foo
bar
end
当我运行ruby file2.rb
时,我得到以下输出:
nat$ ruby file2.rb
file2.rb:4:in `<class:Foo>'
这就是你想要的,对吧?