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

mar*_*uca 64 ruby

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

Dam*_*ien 97

Object.const_get("User")
Run Code Online (Sandbox Code Playgroud)

无需要求ActiveSupport.

  • +1厌恶active_support污染一般ruby问题. (48认同)

Chr*_*ung 61

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

irb(main):001:0> ARGV
=> []
irb(main):002:0> Kernel.const_get "ARGV"
=> []
Run Code Online (Sandbox Code Playgroud)


sev*_*rin 29

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

"User".constantize
Run Code Online (Sandbox Code Playgroud)


psy*_*yho 26

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

'User'.constantize
Run Code Online (Sandbox Code Playgroud)

你也可以使用Kernel const_get,但是在Ruby <2.0中,它不支持命名空间常量,所以像这样:

Kernel.const_get('Foobar::User')
Run Code Online (Sandbox Code Playgroud)

将在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
Run Code Online (Sandbox Code Playgroud)

  • const_get也适用于自ruby 2.0以来的命名空间常量 (9认同)