なに、Rubyの特異メソッドの意味が分からないとな?
def self.baz
と書けばクラスメソッドになるみたいだがどういうことかピンと来ていない?
ふむ、暇じゃから教えて進ぜよう
特定のインスタンスだけが持つメソッド
Rubyに限らず多くのプログラミング言語では、メソッドはクラスに定義するのう。
いや、クラスメソッドという意味ではない。
インスタンスメソッドのことじゃ。インスタンスメソッドはクラスの中で定義するよの?
当たり前のことだと思うかな?
実はRubyは、 インスタンスにメソッドを定義する ことができるんじゃ。
ちょっと見てみい
class MyClass
def foo
p “foo”
end
end
a = MyClass.new
b = MyClass.new
a.foo # => “foo”
b.foo # => “foo”
なんの変哲もないコードじゃな。
これにちょっと書き足してみるぞ
class MyClass
def foo
p “foo”
end
end
a = MyClass.new
b = MyClass.new
a.foo # => “foo”
b.foo # => “foo”
def a.bar
p “bar”
end
a.bar # => “bar”
b.bar # MethodMissing Error
どうじゃ。 a
という インスタンスにメソッドを実装している ということが分かったじゃろ
このことをよく覚えておくんぢゃ
クラスもクラスのオブジェクト
Rubyはオブジェクト指向じゃ。Rubyの世界ではだいたいのものがオブジェクトつまり 何らかのクラスのインスタンス じゃ。
先の例で出した a
や b
という変数は MyClass
クラスのインスタンスじゃ。
1
などの整数もIntegerクラスのインスタンスになっておる
そして、クラスそのものも Class
というクラスのインスタンスなのじゃ。
つまり、先ほどの MyClass
というクラスも Class
クラスのインスタンスなのじゃ
ちなみに Class
クラスも Class
クラスのインスタンスじゃ。なんだか不思議ぢゃのう
まとめると
さて、この2つの話を組み合わせてみよう
勘の良いお主はもう答えに気づいたかも知れんのう。ホッホッホ
先ほど、a
というインスタンスにメソッドを定義したの。
def a.bar
p “bar”
end
これと同じようにな、 MyClass
という(Class
クラスの)インスタンスにメソッドを定義する のぢゃ。
def MyClass.baz
p “baz”
end
MyClass.baz # => “baz”
もう分かったの。
これが特異メソッドの正体じゃ。
- 特異メソッドとは、インスタンスに実装するメソッドである
- Rubyでは、クラスもインスタンスである
- よって、クラスに特異メソッドを実装すると、それはいわゆるクラスメソッドになる
ということだったんぢゃ
おまけ
MyClassに関するコードを抜き出してみるぞ
class MyClass
def foo
p “foo”
end
end
def MyClass.baz
p “baz”
end
これでちゃんと動くのじゃが、同じMyClassに関するコードなのじゃから、ひとまとめにしたほうが良いの。
class MyClass
def foo
p “foo”
end
def MyClass.baz
p “baz”
end
end
うむ。
ところで MyClass
の定義の中に MyClass
と書くのはぢょうちょう(冗長)ぢゃな
そこで
class MyClass
def foo
p “foo”
end
def self.baz
p “baz”
end
end
これでお主の見慣れた書き方になったのう。
めでたしめでたしぢゃ