检查namedspaced类是否存在

时间:2014-03-11 14:04:31

标签: ruby constants

我正在编写帮助程序以检查给定的类是否存在。

def safe_constant(constant_sym)
  return Object.const_get(constant_sym) if Object.const_defined? constant_sym
end

这适用于safe_constant(:User)

之类的内容

但是,我们有许多在模块中命名空间的对象

safe_constant(:Admin::User)显然不是有效的符号。我知道我可以通过以下方式确定是否存在:

Object.const_get(:Admin).const_get(:User)但在我编写某种分裂循环深入分析方法以获得最终常量之前,是否有任何标准的方法来处理它?<​​/ p>

2 个答案:

答案 0 :(得分:1)

根据Ruby API文档,可以使const_defined?const_get与名称空间字符串一起使用来检查并返回类常量。需要做的是将第二个参数(inherit)传递为false,例如:

class User; end

module Admin
  class User; end
end

Object.const_defined?('Admin::User', false) # => true

Object.const_get('Admin::User', false) # => Admin::User

PS:const_defined?const_get不接受命名空间的Symbol并将引发NameError异常,例如:

# namespaced String
Object.const_defined?('Admin::User', false) # => true

# namespaced Symbol
Object.const_defined?(:'Admin::User', false)
# => NameError (wrong constant name Admin::User)

答案 1 :(得分:0)

这样的事情怎么样?

def safe_constant(constant_sym)
  return constant_sym.to_s.constantize if valid_constant? constant_sym.to_s
end


def valid_constant?(const)
  const.constantize
  return true
rescue NameError
  return false
end