我有一个类的名称,我想创建该类的实例,以便我可以循环遍历该类的模式中的每个rails属性。
我将如何做到这一点?
答案 0 :(得分:189)
在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>
答案 1 :(得分:13)
在Rails中非常简单:使用String#constantize
class_name = "MyClass"
instance = class_name.constantize.new
答案 2 :(得分:5)
试试这个:
Kernel.const_get("MyClass").new
然后遍历对象的实例变量:
obj.instance_variables.each do |v|
# do something
end
答案 3 :(得分:4)
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
。上面的示例是提前知道命名空间的时间,并强调了{{1}}可以直接在模块上调用而不是仅在{{1}}上调用的事实。