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



我有一个类的名称,我想创建该类的实例,以便我可以遍历该类模式中存在的每个 rails 属性。

我该怎么做呢?

  1. 我有名字作为我要检查的类的字符串
  2. 我想我需要实例化一个类实例,以便我可以
  3. 循环访问其属性并打印它们。

在 rails 中,您可以执行以下操作:

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上调用的事实。

相关内容

  • 没有找到相关文章

最新更新