1

我想像这样访问一个类的源代码:

# 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

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

欢迎任何提示。

4

2 回答 2

2

两者$0都会__FILE__对你有用。

$0是正在运行的应用程序的路径。

__FILE__是当前脚本的路径。

因此,__FILE__将是脚本或模块,即使它是required.

另外,__LINE__可能对你有用。

有关更多信息,请参阅“ Ruby 中的含义是什么__FILE__ ”、“ Ruby 中的含义是什么if __FILE__ == $0”和“ Ruby 中的含义是什么class_eval <<-“end_eval”, __FILE__, __LINE__ ” 。

于 2012-09-12T17:55:41.340 回答
1

您可以尝试调用:

caller.first

这将打印出文件名和行号。使用上面的演示文件(稍作修改:

文件 1.rb:

module MetaFoo
  class << Object
    def bar
      puts caller.first # <== the magic...
    end
  end
end

文件2.rb:

require './file1.rb'

class Foo
  bar
end

当我运行时ruby file2.rb,我得到以下输出:

nat$ ruby file2.rb 
file2.rb:4:in `<class:Foo>'

这就是你想要的,对吧?

于 2012-09-12T22:44:52.530 回答