Rubyのプログラミング問題でメソッド名を動的に変更する場合について触れたいと思います。
メソッド名を動的に変更する記述方法をメタプログラミングと言うのですが、Rubyではこの方法を持ちいいてメソッド名を動的に変えることが可能です。
例えば次のような問題です。
問題
次の様な配列があるとき
array = %w(apple banana grape tomato potato)
この配列内の値1つずつと同じ名前の、その名前を返すだけのメソッドそれぞれ定義してください。ただし、
それらのメソッドを定義するのに使える合計の行数は 3行までとします。
実行結果の例
apple # => "apple" banana # => "banana"
配列の中にあるappleなどの名前を使って、動的にメソッド名を変更する必要があります。このような場合にメタプログラミングが用いられます。
メタプログラミングとは
問題の解答に入る前に、そもそも「メタプログラミングとは」何かについて見ていきたいと思います。筆者も名前を聞いたことはあったのですが、開発経験が乏しいため実際に触れたことはありませんでした。
「メタプログラミングRuby」ではメタプログラミングについて下記のように定義されています。
メタプログラミングとは、コードを記述するコードを記述することである。
コードの定義はふつうに記述すると静的ですが、メソッド名などを動的に書き換える処理などプログラムの一部を自動生成するものをメタプログラミングと呼ぶそうです。
使い方はこちらの記事が分かりやすかったので参考にしてみてください。
Rubyでのメタプログラミング(動的ディスパッチと動的メソッド) - Qiita
解答
最初の問題に対する解答はこちらの通りです。
define_methodを使うことで、同じ役割を持つ別のメソッドを簡単に定義することが可能になります。
array.each do |material| define_method(material) { puts material } end
まとめ
いかがでしたでしょうか?
メタプログラミングを用いて実際開発現場でコードを書くことはなかなか難易度が高いようです。
これからより深く勉強していき、使いこなせるようになっていきたいですね。