Ruby中的内省

时间:2011-07-15 13:34:01

标签: ruby reflection introspection

我操作一个符号数组,其中一些符号可能是Ruby类名(例如:Fixnum)。

如何选择它们?

当然,我事先并不知道这些符号的完整列表...... 我当然是用Ruby做的。

3 个答案:

答案 0 :(得分:2)

我讨厌使用eval,但....

[:Integer, :Dog, :Fixnum, :String, :Rat].select{|x| defined? x.to_s && Class === eval(x.to_s)}

我尝试了Kernel.const_get,但无法让它发挥作用。

答案 1 :(得分:2)

如果检查是否首先定义了const,则可以使用const_get进行检查:

[:Integer, :Dog, :Fixnum, :String, :Rat].select{ |x| Object.const_defined?(x) && Object.const_get(x).class === Class }
=> [:Integer, :Fixnum, :String]

答案 2 :(得分:0)

ObjectSpace.each_object(Class).map(&:name).map(&:to_sym) & [:Integer, :Dog, :Fixnum, :String, :Rat]
=> [:Fixnum, :Integer, :String]