如何以编程方式获取当前正在执行的代码的类?由于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__
);但那班级怎么样?
答案 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#owner
和Method#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
确定的!)