2

2 つの異なるディレクトリに 2 つのファイルがあります。

module MyModule
  def my_method path
    p File.join (File.dirname __FILE__), path
  end
end

require_relative '../modules/mymodule' # definition of MyModule
class MyClass
  extend MyModule
  my_method 'my_file.yml'
end

次のような出力が得られますが、定義されているディレクトリの名前をどこmy_home_dir/modules/my_file.ymlにしたいのですか。my_home_dir/files/my_file.ymlfilesMyClass

呼び出すときにフルパスを使用できることはわかっていますが、インポートされたファイルをインポートするファイルの名前に設定するmy_method方法はありますか?__FILE__

基本的にmy_method、ファイルの完全なパスが必要であり、呼び出し元のファイルのパスに対する相対パスのみを渡したいと考えています。

4

2 に答える 2

2

__FILE__always は__FILE__変数を含むファイルの名前であるため、呼び出し元ではなく、常に定義されているmy_method場所を返します。my_methodMyClass

おそらく、以下を使用して必要な情報を取得できますcaller

module MyModule
  def my_method path
    p caller
  end
end

include MyModule # definition of MyModule
class MyClass
  extend MyModule
  my_method 'my_file.yml'
end

my_class = MyClass.new

どの出力:

["test.rb:10:in `<class:MyClass>'", "test.rb:8:in `<main>'"]

編集:

呼び出し元の配列にはパスのないファイル名しかありません...

まあ、それを回避する方法を知っていればよかったのですが....

これはtest.rbにあります:

require './test2'
class MyClass
  extend MyModule
  my_method __FILE__, 'my_file.yml'
end

my_class = MyClass.new

これはtest2.rbにあります:

module MyModule
  def my_method path, file
    dir = File.dirname(path)
    p caller.map{ |c| File.join(dir, c) }
  end
end

test.rb 出力の実行:

["./test.rb:4:in `<class:MyClass>'", "./test.rb:2:in `<main>'"]
于 2013-01-21T21:34:25.120 に答える