indexgo
login

Rubyのクラス名やメソッド名に変数を使う

Rubyのクラスやメソッドを呼び出す際に、変数で呼び出せないものかと思って調べてみました。しっかりとそれ専用のクラスやメソッドが用意されていました。

作成者:Ssさん 公開日:2018年9月05日 15時35分 更新日:2018年9月05日 15時35分

クラス名を変数で呼び出すのは「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リファレンス

https://ref.xaio.jp/ruby/classes/module/const_get

Good SoSo
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 (Object) - Rubyリファレンス

https://ref.xaio.jp/ruby/classes/object/send

Good SoSo
sendメソッドは、レシーバの持っているメソッドを呼び出します。第1引数nameにはメソッド名をシンボルか文字列で指定します。メソッドの引数を指定したいときは、第2引数arg以降に引数を並べます。戻り値は、呼び出したメソッドの戻り値が返ります。

共通パーツ化をしていると、Active RecordなどでDBからデータを引く際にどうしてもクラス名が変数でないと共通化できない部分があるので、この二つを覚えておくとコードをコンパクトにできて便利ですね。