【发布时间】:2011-04-22 18:05:04
【问题描述】:
如何将字符串转换为类名,但前提是该类已经存在?
如果 Amber 已经是一个类,我可以通过以下方式从一个字符串中获取该类:
Object.const_get("Amber")
或(在 Rails 中)
"Amber".constantize
但是如果 Amber 还不是一个类,那么其中任何一个都将失败并显示 NameError: uninitialized constant Amber。
我的第一个想法是使用defined? 方法,但它不区分已经存在的类和不存在的类:
>> defined?("Object".constantize)
=> "method"
>> defined?("AClassNameThatCouldNotPossiblyExist".constantize)
=> "method"
那么在尝试转换字符串之前如何测试一个字符串是否命名了一个类? (好吧,begin/rescue 块来捕获 NameError 错误怎么样?太丑了?我同意...)
【问题讨论】:
-
示例中的
defined?正是在做它应该做的事情:它检查是否定义了 String 对象上的constantize方法。它不关心字符串是否包含“Object”或“AClassNameThatCouldNotPossiblyExist”。
标签: ruby ruby-on-rails-3 class defined