2016-11-14 57 views
4
延伸

我想弄清楚模块在Ruby中的扩展位置。现在我唯一能够想到的就是使用caller并挑选合适的线。是否有一种更习惯和更脆弱的方式来处理它?Ruby:其中模块从

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

你只是想找到文件的名称?或者你是否也想找到特定的行号? – Rashmirathi

+0

我只是在寻找文件的路径。不关心行号。 – lobati

+2

你只是好奇,就像诊断目的?在实际代码中使用这种东西可能会有问题。 – tadman

回答

2

我会亲自去这样的事情(基于OP的评论):

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