Ruby 检查NamedSpace类是否存在
我正在编写一个助手来检查给定的类是否存在Ruby 检查NamedSpace类是否存在,ruby,constants,Ruby,Constants,我正在编写一个助手来检查给定的类是否存在 def safe_constant(constant_sym) return Object.const_get(constant_sym) if Object.const_defined? constant_sym end 这对于safe\u常量(:User) 但是,我们有许多在模块中使用名称空间的对象 safe_常量(:Admin::User)显然不是有效的符号。我知道我可以通过以下方式确定是否存在这种情况: Object.const\u get
def safe_constant(constant_sym)
return Object.const_get(constant_sym) if Object.const_defined? constant_sym
end
这对于safe\u常量(:User)
但是,我们有许多在模块中使用名称空间的对象
safe_常量(:Admin::User)
显然不是有效的符号。我知道我可以通过以下方式确定是否存在这种情况:
Object.const\u get(:Admin).const\u get(:User)
但是在我开始编写某种拆分循环向下钻取方法来获取最终常量之前,是否已经有了处理这个问题的标准方法?类似的方法怎么样
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
根据RubyAPI文档,可以获取并使用名称空间字符串检查并返回类常量。需要做的是将第二个参数(
inherit
)传递为false
,例如:
类用户;结束
模块管理员
类用户;结束
结束
Object.const_已定义?('Admin::User',false)#=>true
Object.const_get('Admin::User',false)#=>Admin::User
PS:并且不接受命名空间符号,并将引发NameError异常,例如:
#名称空间字符串
Object.const_已定义?('Admin::User',false)#=>true
#名称空间符号
Object.const_已定义?(:'Admin::User',false)
#=>名称错误(错误的常量名称Admin::User)
接受类名作为符号是否很难?因为将其作为字符串进行测试要容易得多:Object.const_get('Admin::User')rescue nil
。我最初尝试过这样做,但出现了错误:错误的常量名称Admin::User
请注意,constantize
方法来自activesupport gem。