如何在Ruby中将字符串转换为常量?

71

如何将字符串"User"转换为User


你是在尝试调用一个变量函数吗? - wersimmon
1
我也想知道这个问题的答案;但是,您是要基于一个字符串创建新的常量,还是查找已初始化的常量?另外,您是只关注纯 Ruby 还是还包括 Rails? - onebree
4个回答

106
Object.const_get("User")

无需要求ActiveSupport。


使用示例:class User; def self.lookup; const_get('SomeClassName);end; endUser.lookup 将返回类本身。 - Artur INTECH

61

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

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

38

如果你已经加载了ActiveSupport(例如在Rails中),你可以使用以下代码:

"User".constantize

29

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

'User'.constantize

您也可以使用Kernel的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

1
由于Ruby 2.0已经到达EOL,因此不再需要将ActiveSupport作为依赖项引入以使用字符串引用常量。 :-) - Drenmi
请参阅'User'.safe_constantize - Eric Walker
由谁推荐的? - Adam Grant

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接