Ruby:获取当前正在执行代码的类

时间:2017-05-28 18:56:44

标签: ruby

如何以编程方式获取当前正在执行的代码的类?由于super()

,我需要在控制流运行多个方法定义时找到该类
class A
  def foo
    puts(get_current_class)
  end
end

class B < A
  def foo
    puts(get_current_class)
    super
  end
end

class C < B
  def foo
    puts(get_current_class)
    super
  end
end

C.new.foo
# => C
# => B
# => A

我知道如何获取方法名称(使用__callee__caller_locations__method__);但那班级怎么样?

1 个答案:

答案 0 :(得分:1)

由于ruby中的类也是模块,因此可以使用Module#nesting

来实现
class A
  def foo
    puts(Module.nesting.first)
  end
end

class B < A
  def foo
    puts(Module.nesting.first)
    super
  end
end

class C < B
  def foo
    puts(Module.nesting.first)
    super
  end
end

C.new.foo
# => C
# => B
# => A

或者,如果目标是构建对象的祖先链可以调用哪些方法的列表,那么您可以使用Method#ownerMethod#super_method(可用since ruby version 2.2.0 }):

c = C.new
c.method(:foo).owner # => C
c.method(:foo).super_method.owner # => B
c.method(:foo).super_method.super_method.owner # => A
c.method(:foo).super_method.super_method.super_method # => nil

作为一个快速的袖口实现,以编程方式打印所有类,然后,如何:

c = C.new
method = c.method(:foo)
while(method)
  puts m.owner
  method = method.super_method
end
# => C
# => B
# => A

(但是,无法保证所有这些方法都会被实际调用 - 因为这是在运行时通过super确定的!)