首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Ruby中按名称获取类?

在Ruby中按名称获取类?
EN

Stack Overflow用户
提问于 2010-07-02 14:26:40
回答 4查看 29.5K关注 0票数 54

具有包含模块和类名的字符串,如下所示:

代码语言:javascript
复制
"Admin::MetaDatasController"

如何获取实际的类?

如果没有模块,下面的代码可以工作:

代码语言:javascript
复制
Kernel.const_get("MetaDatasController")

但它与模块断开了:

代码语言:javascript
复制
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 > 
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-07-02 14:38:43

如果你想要一些简单的东西来处理你的特殊情况,你可以这样写

代码语言:javascript
复制
Object.const_get("Admin").const_get("MetaDatasController")

但是如果你想要更通用的东西,在::上拆分字符串,然后一个接一个地解析名称:

代码语言:javascript
复制
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并返回Admin模块或类,然后在第二次迭代中要求该模块或类提供常量MetaDatasController,并返回该类。由于没有更多的组件,该类将从方法中返回(如果有更多的组件,它将进行迭代,直到找到最后一个组件)。

票数 97
EN

Stack Overflow用户

发布于 2010-07-02 15:18:51

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

代码语言:javascript
复制
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

票数 47
EN

Stack Overflow用户

发布于 2014-06-26 08:29:35

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

代码语言:javascript
复制
Object.const_get('Admin::MetaDatasController')
=> Admin::MetaDatasController
票数 22
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3163641

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档