如何从 Ruby 中的字符串名称创建类实例?

我有一个类的名称,我想创建一个类的实例,这样我就可以遍历该类模式中的每个 ails 属性。

我该怎么做呢?

  1. 我将名称作为要检查的类的字符串
  2. 我想我需要实例化一个类实例,这样我就可以
  3. 循环访问它的属性并打印它们。
62145 次浏览

在轨道上你只需要做:

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

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