我有一个类的名称,我想创建一个类的实例,这样我就可以遍历该类模式中的每个 ails 属性。
我该怎么做呢?
在轨道上你只需要做:
clazz = 'ExampleClass'.constantize
纯红宝石色:
clazz = Object.const_get('ExampleClass')
模组:
module Foo class Bar end end
你会用
> clazz = 'Foo::Bar'.split('::').inject(Object) {|o,c| o.const_get c} => Foo::Bar > clazz.new => #<Foo::Bar:0x0000010110a4f8>
在 Rails 中非常简单: 使用 String#constantize
String#constantize
class_name = "MyClass" instance = class_name.constantize.new
试试这个:
Kernel.const_get("MyClass").new
然后循环遍历对象的实例变量:
obj.instance_variables.each do |v| # do something end
module One module Two class Three def say_hi puts "say hi" end end end end one = Object.const_get "One" puts one.class # => Module three = One::Two.const_get "Three" puts three.class # => Class three.new.say_hi # => "say hi"
在 ruby 2.0和可能更早的版本中,Object.const_get将在诸如 Foo::Bar之类的名称空间上使用 递归地执行查找。上面的例子是提前知道名称空间,并强调可以直接在模块上调用 const_get,而不是仅在 Object上调用 const_get。
Object.const_get
Foo::Bar
const_get
Object