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


68

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


您是否要调用变量函数?
wersimmon

1
我也想回答这个问题。但是,您是要基于字符串创建新的常量还是要找到已初始化的常量?您还在寻找香草红宝石还是Rails?
2015年

Answers:


100
Object.const_get("User")

无需ActiveSupport。


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

61

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

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

32

如果您已加载ActiveSupport(例如在Rails中),则可以使用

"User".constantize

28

推荐的方法是使用ActiveSupport的常量:

'User'.constantize

您还可以使用Kernel's 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'1

另请参阅'User'.safe_constantize
埃里克·沃克

由谁推荐?
亚当·格兰特

-5

使用红宝石魔术方法eval()

eval("User")  #=>  User

6
这可能是一个彻底的矫kill过eval正,并不意味着要这样使用,应完全避免使用更具体的替代方法。
yagooar
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.