如何在Ruby中将string转换为常量?
如何将string"User"
转换为User
?
Object.const_get("User")
无需要求ActiveSupport。
你可以使用Module#const_get
方法。 例:
irb(main):001:0> ARGV => [] irb(main):002:0> Kernel.const_get "ARGV" => []
如果你有ActiveSupport加载(例如在Rails中),你可以使用
"User".constantize
推荐的方法是使用ActiveSupport的常量化:
'User'.constantize
你也可以使用Kernel的const_get
,但是在Ruby <2.0中,它不支持命名空间常量,所以像这样:
Kernel.const_get('Foobar::User')
将在Ruby <2.0中失败。 所以,如果你想要一个通用的解决scheme,你会明智的使用ActiveSupport方法:
def my_constantize(class_name) unless /\A(?:::)?([AZ]\w*(?:::[AZ]\w*)*)\z/ =~ class_name raise NameError, "#{class_name.inspect} is not a valid constant name!" end Object.module_eval("::#{$1}", __FILE__, __LINE__) end
使用ruby魔法: eval()
:
eval("User") #=> User
- 安装Jekyll – 原生扩展版本时出错
- 欢迎/ Ruby on Rails主页 – 最佳实践
- 如何获得一个单一的字符,而无需按下input?
- Rails 3.2,FATAL:用户对等身份validation失败(PG :: Error)
- 如何在Ruby中expression无穷大?
- 将目录添加到$ LOAD_PATH(Ruby)
- 如何在ruby中生成一个随机的10位数字?
- 错误:'rake / rdoctask'已经过时,不再支持。 改用“rdoc / task”(在RDoc 2.4.2+中可用)
- therubyracer – Gem :: Ext :: BuildError:错误:无法构buildgem原生扩展