如何在运行时访问Ruby类的源文件位置?

时间:2012-09-12 17:35:15

标签: ruby-on-rails ruby metaprogramming

我想像这样访问类的来源:

# 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

但那不是,我想要,我希望有一个更优雅的解决方案。

欢迎任何提示。

2 个答案:

答案 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>'

这就是你想要的,对吧?