gpt4 book ai didi

ruby-on-rails - 获取从给定类派生的类列表

转载 作者:数据小太阳 更新时间:2023-10-29 07:46:13 25 4
gpt4 key购买 nike

我想知道是否有可能获得从给定的 Class 派生的类的列表。

我知道了,有回调Class::inherited ,它将“在创建当前类的子类时调用”。这种方法有两个问题:

  1. 当我不是此类的生产者时(也就是说,我必须对其进行 monkeypatch),我通常无法确保在创建第一个派生类之前应用我的 monkeypatch。
  2. 在完美的世界中,无论类是否已经初始化,我都会得到类的列表,而在实例化类时实际调用回调

我明白,RTTI 可能不是检索我需要的信息的最佳方式(因为上面的 2.)。有人会建议另一种方法吗?静态代码分析?任何?

如果有任何想法,我将不胜感激。比如说,我的目录中有所有感兴趣的代码(换句话说,我对我的类感兴趣,这些类仅派生自一些预定义的类,例如我的 ApplicationController Rails 应用程序。)

最佳答案

使用 TracePoint 怎么样?让我知道以下代码是否符合您的目的 -

class DerivedClassObserver

def initialize(classes)
@classes, @subclasses = classes, {}
end

def start
@trace_point = TracePoint.new(:class) do |tp|
tp.self.ancestors.map do |ancestor|
if ancestor != tp.self && @classes.include?(ancestor.name)
(@subclasses[ancestor.name] ||= []) << tp.self.name
end
end
end

@trace_point.enable
end

def stop
@trace_point.disable
end

def subclasses(class_name)
@subclasses[class_name]
end
end

示例用法

observer = DerivedClassObserver.new %w|A AA|
observer.start

# Borrowed example from @Cary
class A ; end
class AA < A ; end
class AB < A ; end
class AC < A ; end
class AAA < AA; end
class AAB < AA; end
class ABA < AB; end
class ABB < AB; end

observer.stop

puts "A subclasses #{observer.subclasses('A').join(', ')}"
# => A subclasses AA, AB, AC, AAA, AAB, ABA, ABB

puts "AA subclasses #{observer.subclasses('AA').join(', ')}"
# => AA subclasses AAA, AAB

谢谢

关于ruby-on-rails - 获取从给定类派生的类列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29459359/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com