代码之家  ›  专栏  ›  技术社区  ›  Pablo Fernandez

在Ruby中按名称获取类?

  •  48
  • Pablo Fernandez  · 技术社区  · 14 年前

    "Admin::MetaDatasController"
    

    我怎样才能得到真正的课程?

    如果没有模块,则以下代码有效:

    Kernel.const_get("MetaDatasController")
    

    但它与模块有冲突:

    ruby-1.8.7-p174 > Kernel.const_get("Admin::MetaDatasController")
    NameError: wrong constant name Admin::MetaDatasController
            from (irb):34:in `const_get'
            from (irb):34
    ruby-1.8.7-p174 > 
    
    4 回复  |  直到 14 年前
        1
  •  96
  •   Electro SoapBox    12 年前

    Object.const_get("Admin").const_get("MetaDatasController")
    

    但是如果你想要更一般的东西,就把绳子分开 :: 然后一个接一个地解析名字:

    def class_from_string(str)
      str.split('::').inject(Object) do |mod, class_name|
        mod.const_get(class_name)
      end
    end
    
    the_class = class_from_string("Admin::MetaDatasController")
    

    Object 求常数 Admin 并返回 行政 MetaDatasController

        2
  •  46
  •   Ashitaka    10 年前

    ActiveSupport提供了一个名为constantize的方法。如果您在Rails上,我假设您基于常量的名称,那么您已经加载了ActiveSupport。

    require 'active_support/core_ext/string'
    
    class Admin
      class MetaDatasController
      end
    end
    
    "Admin::MetaDatasController".constantize # => Admin::MetaDatasController
    

    https://github.com/rails/rails/blob/85c2141fe3d7edb636a0b5e1d203f05c70db39dc/activesupport/lib/active_support/inflector/methods.rb#L230-L253

        3
  •  22
  •   hololeap    10 年前

    在Ruby 2.x中,您可以这样做:

    Object.const_get('Admin::MetaDatasController')
    => Admin::MetaDatasController
    
        4
  •  1
  •   potatopeelings    14 年前

    我可能离基地太远了,但eval不回班吗?

    eval("Admin::MetaDatasController")
    

    所以 eval("Admin::MetaDatasController").new Admin::MetaDatasController.new