2012-07-15 35 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