Ruby(Motion)でmethodsを使ってメソッド検索

  • 21
    Like
  • 2
    Comment
More than 1 year has passed since last update.

Rubyはirbでmethodsメソッドを使うことで、それぞれのオブジェクトに定義されているメソッドをインタラクティブに検索できて便利ですよね。

メソッド検索用メソッド一覧

http://ruby-doc.org/core-2.0/

methodsという単語を含むメソッドは以下の通りです。

#instance_methods (Module)
#methods (Object)
#private_instance_methods (Module)
#private_methods (Object)
#protected_instance_methods (Module)
#protected_methods (Object)
#public_instance_methods (Module)
#public_methods (Object)
#singleton_methods (Object)

private, public等のスコープやインスタンスメソッドや特異メソッドのみ取り出すものがあるようですね。

ちなみに変数を検索するのもあります。(variablesで検索)

#class_variables (Module)
#global_variables (Kernel)
#instance_variables (Object)
#local_variables (Kernel)
#thread_variables (Thread)

constantsはクラスメソッドとインスタンスメソッドだけ。

::constants (Module)
#constants (Module)

以下の例では基本的にmethodsを使いますが、目的に応じてpublic_methodsinstance_methods等に適宜置き換えてください。

とりあえずアルファベット順にメソッド一覧をみてみる

hoge.methods.sort

めちゃくちゃいっぱいメソッドが出てくるがアルファベット順にソートしておくことで、こんなメソッドないかなーというのが探しやすくなります。

grepしてみる

例えばtargetという文字を含むメソッドを探すには以下のようにします。
ここでは念のためiオプションを付けて大文字小文字を無視しています。CamelCaseを使うRubyMotionでは必須です。

hoge.methods.grep /target/i

Object等の基底クラスで定義されているメソッドを取り除く

hoge.methods - Object.methods

ObjectActiveRecord::Base等、場合に応じて適当に変えてみて下さい。

ちなみにinstance_methodsの検索だったら、

hoge.instance_methods - Module.instance_methods

スーパークラスに定義されているメソッドを取り除く

hoge.methods - hoge.class.superclass.instance_methods
hoge.class.methods - hoge.class.superclass.methods

instance_methodsだったら、第二引数がinclude_superなので実は普通にできます。

hoge.instance_methods(false)

ちなみに:pryが使える場合

pryのlsを使えばやりたいことは多分解決します。

[1] pry(main)> ls hoge

RubyMotionではpryが使えないので上の方法を組み合わせることで、メソッドをうまく探すと幸せになれるかもしれません。