Ruby-获取定义的类名

jay*_*ed1 1 ruby

如何获得定义方法的类?

我已经找到了如何查找后代和ansestors的方法:查找Ruby中一个类的所有后代

但这并不一定会让我得到定义类(实际上是最后一个定义类)。

我已经找到了如何获取调用类: Ruby Inheritance Get Caller Class Name

但我要相反。我想如何获得定义类。

我也试过了Module.nesting。在这种情况下,这就是我想要的,但是我担心,在我没有最终控制权的更大的代码库中,这将是不一致的并且不可接受的。

puts RUBY_VERSION


# Test class vs super.
class Super
    def test_func
      puts "#{self.class}, #{ __method__}"
    end
end

class Child < Super
  def test_func2
     self.test_func
  end
end

Child.new.test_func
Run Code Online (Sandbox Code Playgroud)

我曾希望:

1.8.7

超级,test_func

但是得到了:

1.8.7

孩子,test_func

mec*_*cov 6

您问self.classChild对象,就知道了。

您需要使用Method#owner返回定义该方法的类或模块。

class Super
  def test_func
    puts "#{method(__method__).owner}, #{ __method__}"
  end
end

class Child < Super
  def test_func2
     self.test_func
  end
end

Child.new.test_func
# will print: Super, test_func
Run Code Online (Sandbox Code Playgroud)

要不就

Child.new.method(:test_func).owner
#=> Super
Run Code Online (Sandbox Code Playgroud)

  • 这是太棒了!它甚至可以在1.8.7下运行。谢谢!我正在使用它来添加日志行,而不是手动键入类和方法。 (2认同)