我正在编写帮助程序以检查给定的类是否存在。
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>
答案 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