2010-03-02 54 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

相关问题