Rubyのクラス名やメソッド名に変数を使う
Rubyのクラスやメソッドを呼び出す際に、変数で呼び出せないものかと思って調べてみました。しっかりとそれ専用のクラスやメソッドが用意されていました。
公開日:2018年9月5日
クラス名を変数で呼び出すのは「Object.const_get()」
Object.const_get()を使うことで、()内の文字列名でクラスを参照してくれます。
class_name = 'Hoge'
hoge_class = Object.const_get(class_name).new
# hoge_class = Hoge.newと同じ
const_get (Module) - Rubyリファレンス
const_getメソッドは、クラスやモジュールの定数の値を返します。引数nameには定数名を:NAMEや”NAME”のようにシンボルか文字列で渡します。存在しない定数名を渡すと例外NameErrorが発生します。
メソッド名を変数で呼び出すのは「.send()」
メソッドの方は、.send()メソッドを使うことで変数で呼び出せます。
()内の引数は、.send(メソッド名, メソッドに渡す引数)となっていて、引数は省略ができます。
method_name 'get_fuga'
hoge_class.send(method_name)
# hoge_class.get_fuga()と同じ
hoge_class.send(method_name, sugo_var)
# hoge_class.get_fuga(sugo_var)と同じ
sendメソッドは、レシーバの持っているメソッドを呼び出します。第1引数nameにはメソッド名をシンボルか文字列で指定します。メソッドの引数を指定したいときは、第2引数arg以降に引数を並べます。戻り値は、呼び出したメソッドの戻り値が返ります。
共通パーツ化をしていると、Active RecordなどでDBからデータを引く際にどうしてもクラス名が変数でないと共通化できない部分があるので、この二つを覚えておくとコードをコンパクトにできて便利ですね。
新着ノート
-
Gitlabの2段階認証下でコンテナレジストリにPushする方法
gitlab
公開日:2020年12月23日
-
HUGO
公開日:2020年4月27日
新着コード
-
cURLでCloudflare APIでキャッシュを削除する
cloudflare
公開日:2020年5月1日
-
iOS Safariでselectを含む要素にoverflow-y:scrollすると横にスクロールする時の対応
iOS
公開日:2020年4月15日