1. ホーム
  2. ruby

クラスが定義されているかどうかを確認する方法を教えてください。

2023-08-25 17:39:19

質問

文字列をクラス名に変えるにはどうしたらよいでしょうか。ただし、そのクラスがすでに存在する場合に限ります。

もしAmberが すでに である場合、文字列からクラスへの変換を行うことができます。

Object.const_get("Amber")

または (Railsの場合)

"Amber".constantize

しかし、これらのどちらかは NameError: uninitialized constant Amber で失敗します。

最初に考えたのは defined? メソッドを使うことですが、これはすでに存在するクラスとそうでないものを区別しません。

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

では、文字列を変換する前に、その文字列がクラス名であるかどうかをテストするにはどうすればよいのでしょうか? (さて、どうすれば begin / rescue ブロックは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