読者です 読者をやめる 読者になる 読者になる

Ruby のメソッドやオブジェクトまわりの名称について軽くまとめてみた

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

ab はクラスオブジェクト 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 を理解しやすいかも知れない。
次はモジュールについて理解しないと…。

[参照]

http://qiita.com/ToruFukui/items/95117f418dec590ebbc8