我想弄清楚模块在Ruby中的扩展位置。现在我唯一能够想到的就是使用caller
并挑选合适的线。是否有一种更习惯和更脆弱的方式来处理它?Ruby:其中模块从
module ClassMethods
def self.extended(base)
p caller[2]
end
end
我想弄清楚模块在Ruby中的扩展位置。现在我唯一能够想到的就是使用caller
并挑选合适的线。是否有一种更习惯和更脆弱的方式来处理它?Ruby:其中模块从
module ClassMethods
def self.extended(base)
p caller[2]
end
end
我会亲自去这样的事情(基于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:我知道这是一个巨大的黑客,并不是很好,我会很好奇,知道如果有是这样做的更好的方法。
不错,虽然在那一点上,我可能有一个字面上为模块定义的路径:'class Foo; FILE_PATH = __FILE__;扩展ClassMethods; end'。 – lobati
谢谢。如果我的方法最终变得太痛苦了,我最终可能会将它换成类似的东西。 https://github.com/mockdeep/configurator/commit/03f208 – lobati
对不起,我删除了我以前的回复,这是“是的,非常好的一点,在这种情况下,我会诚实地喜欢传入文件名而不是达到不变。” – Rashmirathi
你只是想找到文件的名称?或者你是否也想找到特定的行号? – Rashmirathi
我只是在寻找文件的路径。不关心行号。 – lobati
你只是好奇,就像诊断目的?在实际代码中使用这种东西可能会有问题。 – tadman