ruby - 如何检查类是否已定义?

标签 ruby ruby-on-rails-3 class defined

如何将字符串转换为类名,但前提是该类已经存在?

如果 Amber 已经是一个类,我可以通过以下方式从字符串获取类:

Object.const_get("Amber")

或(在 Rails 中)

"Amber".constantize

但是,如果 Amber 还不是一个类,它们中的任何一个都会失败并返回 NameError: uninitialized constant Amber

我的第一个想法是使用 defined? 方法,但它不区分已经存在的类和不存在的类:

>> defined?("Object".constantize)
=> "method"
>> defined?("AClassNameThatCouldNotPossiblyExist".constantize)
=> "method"

那么在尝试转换字符串之前如何测试它是否命名了一个类? (好吧,用 begin/rescue block 来捕获 NameError 错误怎么样?太丑了?我同意...)

最佳答案

const_defined?怎么样? ?

请记住,在 Rails 中,开发模式下会自动加载,因此在测试时可能会很棘手:

>> Object.const_defined?('Account')
=> false
>> Account
=> Account(id: integer, username: string, google_api_key: string, created_at: datetime, updated_at: datetime, is_active: boolean, randomize_search_results: boolean, contact_url: string, hide_featured_results: boolean, paginate_search_results: boolean)
>> Object.const_defined?('Account')
=> true

关于ruby - 如何检查类是否已定义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5758464/

相关文章:

javascript - 将Class移除到具有它的元素

java - 如何在java中将 map 转换为实体对象?

ruby-on-rails - 分发 Ruby on Rails 应用程序

ruby-on-rails-3 - Capistrano 部署 Assets 预编译从不编译 Assets ,为什么?

ruby-on-rails-3 - 如何从 mina 部署脚本运行自定义 rake 任务

java - 创建玩家乒乓 block 时的类(class)组织问题

ruby - Jekyll YAML 嵌套列表抛出错误 : found a tab character that violate intendation

ruby - mixin 是否应该对它们的包含类做出假设?

ruby - 使用试运行选项运行 cucumber 时出错

ruby-on-rails - 有没有办法在模块中使用类方法而不在 Rails 中扩展它?