2016-11-14 3 views
4

Я пытаюсь выяснить, где модуль расширяется из Ruby. Прямо сейчас единственное, что я смог придумать, это использовать caller и выбрать соответствующую строку. Есть ли более идиоматический и менее хрупкий способ справиться с этим?Ruby: где модуль расширяется от

module ClassMethods 
    def self.extended(base) 
    p caller[2] 
    end 
end 
+0

Вы хотите найти имя файла? или вы также хотите найти номер конкретной строки? – Rashmirathi

+0

Я просто ищу путь к файлу. Не беспокоит номер строки. – lobati

+2

Вам просто интересно, как в диагностических целях? Использование такого рода вещей в реальном коде может быть проблематичным. – tadman

ответ

2

Я бы лично пойти на что-то вроде этого (основано на комментарий ФП в):

module ClassMethods 
end 

class Object 
    def extend_with_path(mod, filename) 
    p filename 
    self.extend(mod) 
    end 
end 


class Foo 
    extend_with_path ClassMethods, __FILE__ 
end 

Если у вас есть внутреннее знание base класса, вы могли бы попробовать что-то вроде этого:

module ClassMethods 
    def self.extended(base) 
    p base.new.method(:superfluous_method).source_location 
    end 
end 

class Foo 
    def superfluous_method 
    end 

    extend ClassMethods 
end 

PS: Я знаю, что это гигантский взлом и не очень приятный, мне было бы интересно узнать, есть ли там это лучшие способы сделать что-то подобное.

+1

Приятно, хотя в этой точке я мог бы также иметь путь, буквально определенный для модуля: 'class Foo; FILE_PATH = __FILE__; расширить ClassMethods; end'. – lobati

+1

Спасибо. Если мой подход окажется слишком болезненным, я, вероятно, в конечном итоге поменяю его на что-то подобное. https://github.com/mockdeep/configurator/commit/03f208 – lobati

+0

Извините, я удалил свой предыдущий ответ, это было «Да, очень хорошо, в этом случае я бы честно предпочел бы передать имя файла, а не константа «. – Rashmirathi

Смежные вопросы