LoginSignup
1
0

More than 3 years have passed since last update.

Rubyのクラスメソッドをなぜ特異メソッドと呼ぶのか教えて進ぜよう

Posted at

なに、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の世界ではだいたいのものがオブジェクトつまり 何らかのクラスのインスタンス じゃ。
先の例で出した ab という変数は 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

これでお主の見慣れた書き方になったのう。
めでたしめでたしぢゃ

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0