Ruby:如何在运行时定位类的定义?

3
我现在在使用Rails时遇到了一个奇怪的问题...有一个类被定义了,但我找不到它。使用“class ClassName”进行grep搜索没有定位到它,但当我加载Rails控制台时,它肯定是存在的。它只是一个继承自Object且没有其他定义的普通类...相当无聊。因此,我想知道如何从Rails控制台中确定这个类常量最初是从哪里定义的。换句话说,打印出这个类被声明时'__ FILE __'的值的一些东西。我感觉某种类型的元编程应该能够实现这一点。
我考虑只需执行以下操作:
ClassName.class_exec { __FILE__ }

但这只会始终给我当前的文件。

2
为什么不直接给我们类的名称,有人可能会帮你找到它。 - Azeem.Butt
有一个有趣的故事...这个类叫做MatchData。它当然是在核心Ruby中定义的,用于正则表达式结果。我感觉真蠢!不过这里的答案在一般情况下都很有用。 - Derek Thurn
1个回答

5

如果定义了钩子方法inherited,则在创建子类时将调用该方法。因此:

#!/usr/bin/ruby1.8

class Object
  def self.inherited(child)
    target_class = "Child"
    raise "#{target_class} defined" if child.name == target_class
  end
end

class Parent
end

class Child < Parent    # => /tmp/foo.rb:6:in `inherited': Child defined (RuntimeError)
                        # =>         from /tmp/foo.rb:13

end

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