Ruby のメソッドやオブジェクトまわりの名称について軽くまとめてみた
Ruby におけるクラスやメソッド、オブジェクトの意味についていまいちピンと来なかったので雑にまとめてみた。
奈緒、内容が間違っているかも知れないのであしからず。
[クラスオブジェクト]
class
を使って定義したオブジェクトのこと。
# X はクラスオブジェクト class X end
「クラスなのにオブジェクト???」と思うかも知れないが、Ruby のクラスはすべてオブジェクトなのだ。
Ruby のクラスは Class
を使って定義することもできるので、
# Class からクラスを生成する X = Class.new do def any_method end end
このように定義されていると考えると理解しやすいかもしれない。
[インスタンスオブジェクト]
クラスオブジェクトの #new
から生成したオブジェクトのこと。
class X end # a や b は X のインスタンスオブジェクト a = X.new b = X.new
a
や b
はクラスオブジェクト X
のインスタンスオブジェクトになる。
逆に考えるとクラス(オブジェクト)は Class
の『インスタンスオブジェクト』と言えるかも知れない。
[インスタンスメソッド]
インスタンスオブジェクトから呼び出されるメソッドのこと。
クラスオブジェクトの定義内でメソッドを定義する。
class X # インスタンスメソッドはクラス内でメソッドを定義する def x_instance_method end end x = X.new # インスタンスオブジェクトから呼び出すことができる x.x_instance_method # クラスオブジェクトからは呼べない # Error: undefined method `x_instance_method' for X:Class (NoMethodError); X.x_instance_method
クラス内で定義したメソッドはそのクラスのインスタンスオブジェクトから呼び出すことができる。
[クラスメソッド]
クラスオブジェクトから呼び出す事ができるメソッドのこと。
インスタンスメソッドとは違い、自身のクラスオブジェクトを付属させて定義する。
class X # クラスオブジェクトの名前を含めた名前で定義する def X.x_class_method end end # クラスオブジェクトをレシーバとしてメソッドを呼び出す X.x_class_method # インスタンスオブジェクトからは呼び出せない x = X.new # Error: undefined method `x_class_method' for #<x:0x00000001c06fd8> (nomethoderror) x.x_class_method
また、クラスメソッドは以下のように定義することもできます。
class X # クラス名ではなくて self を使う def self.x_class_method end # こういう風にすると複数同時に定義できる class << self def x_class_method_A end def x_class_method_B end end end # クラス外でも定義できる def X.x_class_method end
[特異メソッド]
特異メソッドは特定のオブジェクトに追加するメソッドである。
class X end a = X.new # オブジェクト a に対してメソッドを定義する def a.singleton_method 42 end a.singleton_method
また、クラスメソッドはクラスオブジェクトの特異メソッドといえる。
class X def self.singleton_method end end
は、
# X はオブジェクト class X end # オブジェクトを指定してメソッドを定義できる # つまり特異メソッドと同等である def X.singleton_method end
という風に定義しているのと同等である。
これをみるとクラスメソッドが『クラスオブジェクトの特異メソッド』だという事がわかる。
[まとめ]
class X def self.class_method end def instance_method end end x = X.new def x.singleton_method end # X : クラスオブジェクト # X.class_method : クラスメソッド(クラスオブジェクトの特異メソッド) # x : インスタンスオブジェクト # x.instance_method : インスタンスメソッド # x.singleton_method : インスタンスオブジェクトの特異メソッド
実際のところ Ruby でいうクラスは単なるオブジェクトでしかなく、あとはインスタンスかどうかの違いだけである。
メソッドも定義の仕方はいろいろとあるけど、どのオブジェクトが保持しているのかが違うだけですね。
『クラスがオブジェクトである』という事を最初に頭に要れておくと Ruby を理解しやすいかも知れない。
次はモジュールについて理解しないと…。