Rubyでオブジェクトの中身を調べたい時によく使うメソッド

  • 3
    Like
  • 0
    Comment

Rubyでオブジェクトの中身を調べたい時によく使うメソッド

Rubyはクラスの定義やメソッドの定義の情報を実行時に持っているので、
pry などを使用してオブジェクトが今どういう状態なのか簡単に確認できる。
知っておくと便利な確認方法をメモとしてあげておく。

テスト用のコード

class Sample
   @val = ""
   @@val2 = "class_variable"

   def initialize
     @val = "instance_variable"
   end

   def show
     puts @val
   end
end

sample = Sample.new

インスタンス変数一覧を取得したい

インスタンスオブジェクトから、一覧が取得できる。

[5] pry(main)> sample.instance_variables
=> [:@val]

クラス変数一覧を取得したい

クラス変数はクラスオブジェクトから取得する。

[6] pry(main)> Sample.class_variables
=> [:@@val2]
[7] pry(main)> sample.class.class_variables
=> [:@@val2]

インスタンスメソッド一覧を取得したい

メソッドの情報は、インスタンスオブジェクトではなく、クラスオブジェクトが情報を持っているので、
こちらから呼び出す。

[9] pry(main)> Sample.instance_methods(false)
=> [:show]

引数に与えるbool値をfalseにすると、そのクラスで定義されたメソッドのみを出力し、
trueなら親から継承したメソッドも含めて返す。

出力が大量にあるときは、以下のようにgrepを使うと便利。

[15] pry(main)> Sample.instance_methods(true).grep(/^to/)
=> [:to_json, :to_yaml, :to_yaml_properties, :to_param, :to_query, :to_enum, :to_s]

method_missingが定義されているクラスの場合、メソッド一覧にないものでも、何かしら使用されている場合があるので、注意が必要。

クラスの親、祖先が知りたい

Module#ancestors を使う。

[27] pry(main)> Sample.ancestors
=> [Sample,
 ActiveSupport::ToJsonWithActiveSupportEncoder,
 Object,
 PP::ObjectMixin,
 ActiveSupport::Dependencies::Loadable,
 JSON::Ext::Generator::GeneratorMethods::Object,
 ActiveSupport::Tryable,
 Kernel,
 BasicObject]

メソッドの定義されている場所、内容が知りたい

Methodオブジェクトのsource_locationを使えば、メソッドが定義されている場所と行数が得られる。

23] pry(main)> 1.method(:to_s).source_location
=> ["..(略)/gems/activesupport-5.0.0/lib/active_support/core_ext/numeric/conversions.rb", 103]

pryを使っているなら、以下のようにコメントと定義を得ることができて便利。

[26] pry(main)> ? 1.to_s
 # コメントを表示・・・
[27] pry(main)> $ 1.to_s
 # ソースを表示・・・

他にも色々あるけど、とりあえずよく使いそうなのは以上。
また適宜追予定。