たちは、次のモジュールFoo
があるとし
a = ObjectSpace.each_object(Class).with_object([]) { |k,a|
a << k if k.to_s.start_with?("Foo::") }
#=> [Foo::Tar, Foo::Goo::Bar, Foo::Bar]
ObjectSpace::each_objectを参照してください。
あなたは配列a
であなたが望むことができます。あなたがしたい場合
b = a.select { |k| k.to_s.end_with?("Bar") }
#=> [Foo::Goo::Bar, Foo::Bar]
は「フー::」除外(なぜ私が想像することはできませんが)名前の部分は、それは単純な文字列です:おそらく、あなたが名前"Bar"
で終わるclasesにこれを狭めたいです操作:なしオブジェクトBar
またはGoo::Bar
がないことを
b.map { |k| k.to_s["Foo::".size..-1] }
#=> ["Goo::Bar", "Bar"]
または
b.map { |k| k.to_s[/(?<=\AFoo::).*/]
#=> ["Goo::Bar", "Bar"] }
注意。
_Sidenote_:あなたの正規表現は 'Fooの::バー:: Baz'と2とより多くのネスティングレベルを持つ任意のクラスに間違った結果を生成します。 – mudasobwa