2012-07-15 66 views
9

假设我可以构造一个匹配现有类的字符串,我该如何调用它?如何在Rails中动态调用或调用类?

例如,我有几类:

  • MyClass1的
  • MyClass2
  • MyClass3

而且我想通过构建他们的名字相匹配的字符串动态调用它们中的每。如果他们都有方法“方法”,我怎么做这样的事?:

(1..3).each do |n| 
    ("MyClass"+n).methods 
end 
+0

确定匿名类数组中的不适合?只要您通过迭代开始使用名称空间,您应该重新考虑您的代码。 – Reactormonk 2012-07-15 11:57:57

+0

Hi Tass,你可以扩展“数组中的匿名类”吗?我相当积极,这不是解决我目前正在研究的问题的最好方法,但我认为我应该知道如何做这样的事情。 – comb 2012-07-15 17:47:26

回答

14

constantize符合该法案。你可以阅读更多关于它here。在你的情况下,它会是这样的:

(1..3).each do |n| 
    "MyClass#{n}".constantize.methods 
end 
+0

谢谢!跟随zsquare的答案,我结束了两个答案! 克拉斯= Object.const_get“MyClassName” - 或 - 克拉斯=“MyClassName” .constantize 两种方法都返回不管什么牌子的乐趣,你感兴趣的类。 虽然四处寻找,我也发现Inflector类可以方便地动态构建类名。 http://api.rubyonrails.org/classes/ActiveSupport/Inflector.html#method-i-camelize – comb 2012-07-15 07:59:57

-3

你也可以做 -

(1..3).each {|n| eval "MyClass#{n}.methods"} 
+1

Downvote for'eval'。你不应该使用类似'eval'的东西,除非你确定必须这样做,并且确定没有其他方法可以做到这一点。然后,如果你确定你可能做错了什么。 – zsquare 2012-07-15 08:27:15

+0

如果你需要在ruby中做到这一点,即没有rails,你会采用其他方式调用它吗? – saihgala 2012-07-15 08:54:51

+0

'classname ='Integer'; Kernel.const_get(classname).methods' – zsquare 2012-07-15 09:04:03