Ruby:扩展自模块的位置

4

我正在尝试找出Ruby中一个模块的继承来源。目前,我唯一能想到的方法是使用caller并挑选出适当的行。是否有更符合习惯且不那么脆弱的处理方式?

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

你只是想找到文件的名称吗?还是你也想找到特定的行号? - Rashmirathi
我只是在寻找文件的路径,不关心行号。 - lobati
2
你只是出于好奇,比如为了诊断目的吗?在实际代码中使用这种东西可能会有问题。 - tadman
好的,我正在实际代码中使用它,尽管它不是我过于依赖的东西。我正在尝试在项目内自动加载配置文件(如果有的话)。如果没有,也没关系。 - lobati
1
这会让人们非常困惑。让人们直接指定位置可能更好。 - tadman
我对风险感到舒适。我会确保将其添加到自述文件中。 - lobati
1个回答

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: 我知道这是一个巨大的hack,不太友好,我很想知道是否有更好的方法来做类似的事情。


1
不错,不过在那个点上,我可能会直接为模块定义路径:class Foo; FILE_PATH = __FILE__; extend ClassMethods; end - lobati
1
谢谢。如果我的方法最终太痛苦了,我可能会换成像那样的东西。https://github.com/mockdeep/configurator/commit/03f208 - lobati
抱歉,我删除了之前的回复,它是“是的,非常好的观点,在这种情况下,我会更愿意传递文件名而不是寻找常量。” - Rashmirathi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接