Rubyでは対象のオブジェクトで使えるメソッドの一覧を表示させたい、といった場面があります。Rubyにはほかのプログラミング言語のような関数はなく、使えるのはオブジェクトに定義されたメソッドです。そのため使いたいメソッドが、対象のオブジェクトに定義されていなければ、別の方法を検討しなければなりません。
今回はオブジェクトに定義されたメソッドの一覧を表示するmethodsメソッドの使い方を中心に、オブジェクトに定義されたメソッドの確認方法について解説します。
Rubyの変数はオブジェクト
プログラミング言語Rubyはオープンソースのオブジェクト指向言語です。そしてRubyではプログラムの中で扱う変数のほとんどがオブジェクトです。では変数がオブジェクトだとどんなメリットがあるのでしょうか。次からRubyの変数がオブジェクトであるメリットについて紹介します。
そもそもオブジェクトとは
オブジェクトを簡単に表現すると、ある機能を実現するための動作と、その動作で使う変数を1つにまとめたものです。アプリケーションの機能の一部となる処理と、その処理で使うデータを1つのパッケージとしてまとめられるため、グラフィック処理など高度なスキルを必要とする処理を、手軽に使う技術として、いろいろな分野のプログラムで広く使われています。
そしてRubyのようなオブジェクト指向のプログラミング言語では、このようなオブジェクトを利用しやすい仕組みを備えているのが特徴です。特にRubyでは、クラスを使って新しいオブジェクトを作ることも可能ですが、外部のオブジェクトを利用しやすく、さらにプログラムの中で扱う変数が全てオブジェクトという特徴を持っています。
オブジェクトを使うメリット
オブジェクトを使うメリットとは、既にある優れたプログラムを簡単に部品として組み込める点です。オブジェクトには特定の処理で使われる変数と、その変数を使うための処理が定義されているため、そのプログラムの詳細を理解していなくても、使い方さえ知っていれば高度な処理を利用できます。
例えばRubyで作られたWebシステムのフレームワークであるRuby on Railsは、Web開発に必要な処理がオブジェクトとして用意されています。そのため、Ruby on Railsの規約に従って利用することで、Webシステムで使われる技術の詳細を理解していなくても、手軽にWebシステムを開発することが可能です。
メソッドを利用するには
オブジェクトを活用するにはそのオブジェクトに定義されたデータの仕様と、そのデータを扱うメソッドの使い方を知らなければなりません。せっかく便利なメソッドが用意されているのに、同じ処理を別に作ってしまったのでは時間の無駄です。
オブジェクトを活用するなら、そのオブジェクトに用意されているメソッドの使い方を調べて活用できるようになりましょう。とはいえドキュメントが不十分な場合は、事前にオブジェクトで使えるメソッドを調べて、その使い方をオブジェクトのソースリストで確認する、といった作業も必要です。
メソッドの一覧を取得する機能
先ほど解説したようにオブジェクトを活用するには、そのオブジェクトで利用できるメソッドをしらなければなりません。オブジェクトで利用できるメソッドを調べられると便利です。そのためRubyには、対象のオブジェクトに定義されたメソッドの一覧を調べる機能としてmethodsメソッドが用意されています。次から、その機能の使い方について紹介します。
methodメソッドの概要
Rubyで扱えるほぼ全ての変数がオブジェクトです。そしてオブジェクトには継承機能があり、基になったオブジェクトの機能を引き継いで、新しいオブジェクトを定義できます。そのためRubyの変数の基になるクラスは階層構造になっており、もっとも上位にあたるクラスがスーパークラスです。今回紹介するmthodsメソッドは、そのようにスーパークラスのメソッドです。
methodメソッドはスーパークラスのメソッドのため、Rubyのほぼ全ての変数で利用できます。ただし、このメソッドの対象のオブジェクトはnewメソッドでインスタンスしたものでなければなりません。クラスを宣言しただけ、または、requireでライブラリを読み込んだだけでは利用できないので注意してください。
methodsメソッドの使い方
methodsメソッドは、必ずオブジェクトに接続して利用します。そして戻り値は、そのオブジェクトが利用できるメソッド名の一覧にあたる配列です。
methodsメソッドの文法
オブジェクト.methods
methodsメソッドを使った例
strs = "test" pp strs.methods
この例では、変数に文字列”test”を代入することで、自動的に文字列クラスのオブジェクト、strsが作られます。そしてstrsにmethodsメソッドを適用し、ppメソッドで表示することで、文字列クラスに定義されている全てのメソッドが表示されます。
methodsメソッドの結果
methodsメソッドで作られたメソッド一覧には、メソッド名に「:」が付いたシンボル名が使われます。
methodsメソッドの実行結果の例
[:to_c, :to_str, :to_sym, :to_s, :to_i, :to_f, :to_r, :to_enum]
上記の「:to_c」などは文字列オブジェクトではなくシンボルオブジェクトです。Rubyでは文字列とシンブルは全く別のオブジェクトなので注意してください。
methodsメソッドの実行例
先ほど紹介したようにRubyではmethodsメソッドを利用することで対象のオブジェクトで利用できるメソッドの一覧を得られます。そしてその一覧は配列なので、さらに配列のオブジェクトで使えるメソッドを組み合わせることで調べる対象を絞り、目的のメソッドの有無をチェックすることが可能です。
次からmethodsメソッドにさらにメソッドを組み合わせた実行例を紹介します。
grepメソッドを組み合わせる
Rubyのgrepメソッドは、配列の各要素と引数で指定したオブジェクトを評価して、該当する要素の配列を返します。そしてmethodsメソッドの返す配列の要素をgrepメソッドで評価することで、探したいメソッドの絞り込みに利用可能です。
methodsメソッドにgrepメソッドと組み合わせた例
strs = "test" pp strs.methods.grep(/to_/)
この例では、RubyのStringクラスで使える全てのメソッドの中から、”to_”を含むメソッドのみ絞り込んだ配列を作成します。
上の例の実行結果
[:to_c, :to_str, :to_sym, :to_s, :to_i, :to_f, :to_r, :to_enum]
eachメソッドで文字列として扱う
先ほど紹介したようにmethodsメソッドで作成した一覧はシンボルの配列です。配列のためeachメソッドが使えるのでブロック内で加工して表示できます。ただし、配列の要素はシンボルのため、文字列のように操作できません。そこで次のように、シンボルを文字列にして加工したうえで探したいメソッドを絞ることも可能です。
methodsメソッドにeachメソッドと組み合わせた例
strs = "test" arr = strs.methods arr.each { |x| if x.to_s.include?('?') then p x end }
この例では、methodsメソッドの結果に対してeachメソッドを適用し、さらにto_sメソッドでシンボルを文字列に変換したうえでinclude?メソッドで評価した結果を表示しています。
まとめ
これまで紹介したようにRubyで扱う変数のほとんどはオブジェクトであり、そのオブジェクトで利用できるメソッドの一覧をmethodsメソッドで作成できます。そしてこの一覧はシンボルの配列のため、配列を対象にしたメソッドを組みわせることで、対象のオブジェクトで利用できる調べたいメソッドを絞ることが可能です。
今回紹介したように簡単なスクリプトを組み込むことでメソッドの有無をチェックできるため、Rubyのプログラム作成時に利用してください。