有一个包含模块和类名的字符串,例如:
"Admin::MetaDatasController"
Run Code Online (Sandbox Code Playgroud)
我如何获得实际课程?
如果没有模块,以下代码可以工作:
Kernel.const_get("MetaDatasController")
Run Code Online (Sandbox Code Playgroud)
但它打破了模块:
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 >
Run Code Online (Sandbox Code Playgroud)
The*_*heo 90
如果你想要一些简单的东西来处理你的特殊情况你可以写
Object.const_get("Admin").const_get("MetaDatasController")
Run Code Online (Sandbox Code Playgroud)
但是如果你想要更通用的东西,拆分字符串::
并一个接一个地解析名字:
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")
Run Code Online (Sandbox Code Playgroud)
在第一次迭代时Object
,要求输入常量Admin
并返回Admin
模块或类,然后在第二次迭代中询问模块或类的常量MetaDatasController
,并返回该类.由于没有更多的组件从该方法返回类(如果有更多的组件,它将迭代,直到找到最后一个).
Jos*_*eek 45
ActiveSupport提供了一个名为constantize的方法,它将执行此操作.如果您使用的是Rails,我认为您基于常量的名称,那么您已经加载了ActiveSupport.
require 'active_support/core_ext/string'
class Admin
class MetaDatasController
end
end
"Admin::MetaDatasController".constantize # => Admin::MetaDatasController
Run Code Online (Sandbox Code Playgroud)
hol*_*eap 22
在Ruby 2.x中,您可以这样做:
Object.const_get('Admin::MetaDatasController')
=> Admin::MetaDatasController
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
26545 次 |
最近记录: |