для модуля ruby ​​возможно получить каталог файла, который определил класс, который включал модуль? - PullRequest
4 голосов
/ 05 августа 2010

У меня есть модуль и класс, который включает в себя модуль. они не определены в том же файле или в той же папке. я хочу, чтобы модуль получил каталог, в котором определен класс.

# ./modules/foo.rb
module Foo
  def self.included(obj)
    obj_dirname = # ??? what goes here?
    puts "the class that included Foo was defined in this directory: #{obj_dirname}"
  end
end

# ./bar.rb
class Bar
  include Foo
end

Я ожидаю, что результат будет:

the class that included Foo was defined in this directory: ../

это возможно? если да, то как?

Ответы [ 4 ]

3 голосов
/ 06 августа 2010

Классы могут быть определены во многих файлах, поэтому нет реального ответа на ваш вопрос.С другой стороны, вы можете сказать, из какого файла был сделан include Foo:

# ./modules/foo.rb
module Foo
  def self.included(obj)
    path, = caller[0].partition(":")
    puts "the module Foo was included from this file: #{path}"
  end
end

Это будет путь, который вы ищете, если только не существует MyClass.send :include, Foo где-то еще, где был MyClassопределены ...

Примечание : для Ruby 1.8.6: require 'backports' или изменить partition на что-то другое.

2 голосов
/ 06 августа 2010

Нет встроенного способа узнать, где был определен модуль или класс (afaik).В Ruby вы можете заново открыть модуль / класс в любое время и в любом месте и добавить или изменить поведение.Это означает, что обычно не существует единственного места, где определяется модуль / класс, и такой метод не имеет смысла.

В вашем приложении вы можете, однако, придерживаться некоторого соглашения, чтобы вы могли построитьисходное имя файла.Например, в Rails контроллер страниц по соглашению называется PagesController и определяется в основном в файле app / controllers / pages_controller.rb.

0 голосов
/ 06 августа 2010
module Foo

  def self.included obj
    filename = obj.instance_eval '__FILE__'
    dirname = File.expand_path(File.dirname(filename))
    puts "the class that included Foo was defined in this directory: #{dirname}"
  end

end
0 голосов
/ 05 августа 2010

Делает ли это то, что вы хотите?

module Foo
  def self.included(obj)
    obj_dirname = File.expand_path(File.dirname($0)) 
    puts "the class that included Foo was defined in this directory: #{obj_dirname}"
  end
end

Редактировать: изменено в соответствии с комментариями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...