Как я могу получить доступ к текущему __FILE__ в подклассе из метода в суперклассе в ruby - PullRequest
6 голосов
/ 27 января 2011

Я надеюсь установить путь для ведения журнала по умолчанию относительно пути к файлу, в котором используется журнал, что-то вроде этого:

# /path/to/lib/bar.rb
class Bar
  def settings_file_path
    File.dirname(File.expand_path(__FILE__))
  end
end

# /path/to/app/models/foo.rb
class Foo < Bar
end

Foo.new.settings_file_path

Идеальный выход:

# => /path/to/app/models

Фактический объем производства:

# => /path/to/lib

Поскольку FILE ссылается на файл, в который он записан, а не на тот, откуда он вызывается, он возвращает файл bar.rb, но я хочу, чтобы что-то подобное возвращало путь к файлу foo.rb, даже если метод определен в Bar.

У кого-нибудь есть предложения?

Ответы [ 2 ]

6 голосов
/ 27 января 2011

Самое простое было бы что-то вроде этого:

# foo.rb
class Foo
  def self.my_file
    @my_file
  end
end

# bar.rb
class Bar < Foo
  @my_file = __FILE__
end

# main.rb
require_relative 'foo'
require_relative 'bar'
p Bar.my_file
#=> "/Users/phrogz/Desktop/bar.rb"

Тем не менее, вы можете проанализировать вызывающего абонента в наследуемом хуке так:

# foo.rb
class Foo
  class << self
    attr_accessor :_file
  end
  def self.inherited( k )
    k._file = caller.first[/^[^:]+/]
  end
end

# bar.rb
class Bar < Foo
end

# main.rb
require_relative 'foo'
require_relative 'bar'

p Bar._file
#=> "/Users/phrogz/Desktop/bar.rb"

Я не уверен, насколько надежен или переносим этот анализ; Я предлагаю вам проверить это.

N.B. Мой Bar унаследован от Foo, обратная сторона вашего вопроса. Не смущайтесь различиями в наших настройках.

0 голосов
/ 27 января 2011

Используйте $ 0 вместо __ FILE__:)

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