【问题标题】:Introspection in RubyRuby 中的自省
【发布时间】:2023-04-06 09:14:01
【问题描述】:

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

如何选择它们?

当然,我事先并不知道这些符号的完整列表…… 当然,我在 Ruby 中这样做。

【问题讨论】:

    标签: ruby reflection introspection


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        【解决方案3】:
        ObjectSpace.each_object(Class).map(&:name).map(&:to_sym) & [:Integer, :Dog, :Fixnum, :String, :Rat]
        => [:Fixnum, :Integer, :String]
        

        【讨论】:

          猜你喜欢
          • 2014-07-04
          • 2011-01-30
          • 1970-01-01
          • 1970-01-01
          • 2017-07-18
          • 1970-01-01
          • 1970-01-01
          • 2018-09-30
          • 2012-10-31
          相关资源
          最近更新 更多