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__あなたに役立つかもしれません。

詳細について__FILE__Ruby での意味」、「Ruby での意味」、および「Ruby での意味」を参照てください。if __FILE__ == $0class_eval <<-“end_eval”, __FILE__, __LINE__

于 2012-09-12T17:55:41.340 に答える
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>'

それがあなたが望むものですよね?

于 2012-09-12T22:44:52.530 に答える