2010-03-02 24 views
53

如何將字符串轉換爲User如何在Ruby中將字符串轉換爲常量?

+0

你們是不是要調用一個變量函數? – harbichidian 2010-03-02 06:55:09

+1

我也想回答這個問題;然而,你是否試圖創建一個基於字符串的新常量,或者找到一個已經初始化的常量?你也在尋找香草紅寶石還是Rails? – onebree 2015-08-26 20:37:20

回答

61

您可以使用Module#const_get方法。例如:

irb(main):001:0> ARGV 
=> [] 
irb(main):002:0> Kernel.const_get "ARGV" 
=> [] 
25

如果你的ActiveSupport加載(例如,在Rails的),你可以使用

"User".constantize 
22

推薦的方法是使用的ActiveSupport的constantize:

'User'.constantize 

你也可以使用內核const_get,但在Ruby < 2.0中,它不支持命名空間常量,所以像這樣:

Kernel.const_get('Foobar::User') 

將在Ruby < 2.0中失敗。所以,如果你想有一個通用的解決方案,你是明智使用的ActiveSupport方法:

def my_constantize(class_name) 
    unless /\A(?:::)?([A-Z]\w*(?:::[A-Z]\w*)*)\z/ =~ class_name 
    raise NameError, "#{class_name.inspect} is not a valid constant name!" 
    end 

    Object.module_eval("::#{$1}", __FILE__, __LINE__) 
end 
+8

從Ruby 2.0開始,const_get也可以用於命名空間常量 – untidyhair 2014-03-29 17:56:31

+0

由於Ruby 2.0已經達到了EOL,所以不再需要將ActiveSupport作爲依賴來引用帶有字符串的常量。 :-) – Drenmi 2017-01-02 11:25:23

+0

另請參閱''User'.safe_constantize' – 2017-03-14 18:15:24

75
Object.const_get("User") 

無需需要的ActiveSupport。

+40

+1積極支持污染一般紅寶石問題。 – 2013-01-18 22:27:48

-3

使用Ruby魔術方法:eval()

eval("User") #=> User 
+4

這可能是一個完整的矯枉過正,因爲'eval'並不意味着要這樣使用,應該完全避免使用更具體的替代方案。 – yagooar 2015-08-20 12:45:51

相關問題